@applitools/eyes-browser 1.4.21 → 1.4.22

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,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.4.22](https://github.com/Applitools-Dev/sdk/compare/js/eyes-browser@1.4.21...js/eyes-browser@1.4.22) (2025-03-06)
4
+
5
+
6
+ ### Dependencies
7
+
8
+ * @applitools/core bumped to 4.32.2
9
+ #### Bug Fixes
10
+
11
+ * add environment variable aliases (_NAME suffix) ([#2791](https://github.com/Applitools-Dev/sdk/issues/2791)) ([67501a4](https://github.com/Applitools-Dev/sdk/commit/67501a4f5491319ca62949a56ee03face08a59e5))
12
+ * support test concurrency in offline mode ([#2831](https://github.com/Applitools-Dev/sdk/issues/2831)) ([3b7d137](https://github.com/Applitools-Dev/sdk/commit/3b7d137a9b34bb5c564e0a5c7d3fb2520ef8a167))
13
+ * @applitools/eyes bumped to 1.32.6
14
+
15
+
3
16
  ## [1.4.21](https://github.com/Applitools-Dev/sdk/compare/js/eyes-browser@1.4.20...js/eyes-browser@1.4.21) (2025-01-30)
4
17
 
5
18
 
package/dist/index.js CHANGED
@@ -4392,7 +4392,7 @@ var require_general = __commonJS({
4392
4392
  return result;
4393
4393
  };
4394
4394
  Object.defineProperty(exports, "__esModule", { value: true });
4395
- exports.pluralize = exports.extend = exports.wrap = exports.batchify = exports.cachify = exports.absolutizeUrl = exports.removeUndefinedProps = exports.toUriEncoding = exports.toUnAnchoredUri = exports.toString = exports.toJSON = exports.sleep = exports.jwtDecode = exports.shortid = exports.guid = exports.getEnvValue = void 0;
4395
+ exports.dedupAndMap = exports.deepEqual = exports.pluralize = exports.extend = exports.wrap = exports.batchify = exports.cachify = exports.absolutizeUrl = exports.removeUndefinedProps = exports.toUriEncoding = exports.toUnAnchoredUri = exports.toString = exports.toJSON = exports.sleep = exports.jwtDecode = exports.shortid = exports.guid = exports.getEnvValue = void 0;
4396
4396
  var buffer_1 = require_buffer();
4397
4397
  var types20 = __importStar(require_types());
4398
4398
  function getEnvValue(name, type) {
@@ -4547,6 +4547,50 @@ var require_general = __commonJS({
4547
4547
  return res;
4548
4548
  }
4549
4549
  exports.pluralize = pluralize;
4550
+ function deepEqual(value1, value2) {
4551
+ return _deepEqual(value1, value2, /* @__PURE__ */ new Set());
4552
+ }
4553
+ exports.deepEqual = deepEqual;
4554
+ function _deepEqual(value1, value2, visitedObjects) {
4555
+ if (value1 === value2)
4556
+ return true;
4557
+ if (visitedObjects.has(value1) && visitedObjects.has(value2))
4558
+ throw new Error("circular reference");
4559
+ if (typeof value1 === "object" && typeof value2 === "object") {
4560
+ visitedObjects.add(value1);
4561
+ visitedObjects.add(value2);
4562
+ }
4563
+ if (types20.isArray(value1) && types20.isArray(value2)) {
4564
+ if (value1.length !== value2.length)
4565
+ return false;
4566
+ for (let i = 0; i < value1.length; i++) {
4567
+ if (!_deepEqual(value1[i], value2[i], visitedObjects))
4568
+ return false;
4569
+ }
4570
+ return true;
4571
+ }
4572
+ if (types20.isObject(value1) && types20.isObject(value2)) {
4573
+ const keys1 = Object.keys(value1);
4574
+ const keys2 = Object.keys(value2);
4575
+ if (keys1.length !== keys2.length)
4576
+ return false;
4577
+ for (const key of keys1) {
4578
+ if (!_deepEqual(value1[key], value2[key], visitedObjects))
4579
+ return false;
4580
+ }
4581
+ return true;
4582
+ }
4583
+ return false;
4584
+ }
4585
+ async function dedupAndMap(items, transform, isEqual) {
4586
+ const firstIndecies = items.map((value) => items.findIndex((v) => isEqual(v, value)));
4587
+ const uniqueValues = items.filter((_, index) => firstIndecies.indexOf(index) === index);
4588
+ const results = await transform(uniqueValues);
4589
+ const resultMap = /* @__PURE__ */ new WeakMap();
4590
+ uniqueValues.forEach((val, index) => resultMap.set(val, results[index]));
4591
+ return items.map((_, index) => resultMap.get(items[firstIndecies[index]]));
4592
+ }
4593
+ exports.dedupAndMap = dedupAndMap;
4550
4594
  }
4551
4595
  });
4552
4596
 
@@ -67055,7 +67099,7 @@ creating temp style for access.`), r2 = Sf(e4);
67055
67099
  function R2(e5) {
67056
67100
  return t5.defaultView && t5.defaultView.frameElement && t5.defaultView.frameElement.getAttribute(e5);
67057
67101
  }
67058
- }(t4).then((e4) => (h2("processPage end"), e4.scriptVersion = "4.11.15", e4));
67102
+ }(t4).then((e4) => (h2("processPage end"), e4.scriptVersion = "4.11.16", e4));
67059
67103
  };
67060
67104
  window[cg] = window[cg] || {};
67061
67105
  const dg = lg(hg, window[cg], ug);
@@ -67826,6 +67870,52 @@ var require_to_generated_selectors = __commonJS({
67826
67870
  }
67827
67871
  });
67828
67872
 
67873
+ // ../core/dist/ufg/utils/filterStaleElements.js
67874
+ var require_filterStaleElements = __commonJS({
67875
+ "../core/dist/ufg/utils/filterStaleElements.js"(exports) {
67876
+ "use strict";
67877
+ init_process();
67878
+ init_setImmediate();
67879
+ init_buffer();
67880
+ init_setInterval();
67881
+ Object.defineProperty(exports, "__esModule", { value: true });
67882
+ exports.removeStaleElementsFromDomSnapshotsSettings = exports.filterStaleElements = exports.isStale = void 0;
67883
+ async function isStale({ context, element }) {
67884
+ try {
67885
+ await context.execute("return arguments[0]", element);
67886
+ } catch {
67887
+ return true;
67888
+ }
67889
+ return false;
67890
+ }
67891
+ exports.isStale = isStale;
67892
+ async function filterStaleElements({ context, elementReferences }) {
67893
+ if (!elementReferences)
67894
+ return [];
67895
+ const validElements = [];
67896
+ for (const element of elementReferences) {
67897
+ if (!await isStale({ context, element })) {
67898
+ validElements.push(element);
67899
+ }
67900
+ }
67901
+ return validElements;
67902
+ }
67903
+ exports.filterStaleElements = filterStaleElements;
67904
+ async function removeStaleElementsFromDomSnapshotsSettings({ context, settings, targetElement }) {
67905
+ if (await isStale({ context, element: targetElement })) {
67906
+ throw new Error("Target element is stale - please make sure the element is not detached from the DOM tree. Failed to recover from stale element");
67907
+ } else {
67908
+ settings.elementReferences = await filterStaleElements({
67909
+ context,
67910
+ elementReferences: settings.elementReferences
67911
+ });
67912
+ }
67913
+ return settings;
67914
+ }
67915
+ exports.removeStaleElementsFromDomSnapshotsSettings = removeStaleElementsFromDomSnapshotsSettings;
67916
+ }
67917
+ });
67918
+
67829
67919
  // ../core/dist/ufg/take-snapshots.js
67830
67920
  var require_take_snapshots2 = __commonJS({
67831
67921
  "../core/dist/ufg/take-snapshots.js"(exports) {
@@ -67841,9 +67931,10 @@ var require_take_snapshots2 = __commonJS({
67841
67931
  var to_safe_check_settings_1 = require_to_safe_check_settings();
67842
67932
  var to_generated_selectors_1 = require_to_generated_selectors();
67843
67933
  var abort_error_1 = require_abort_error();
67934
+ var filterStaleElements_1 = require_filterStaleElements();
67844
67935
  function makeTakeSnapshots({ core, spec, signal, logger: mainLogger }) {
67845
67936
  return async function takeSnapshots({ driver, settings = {}, account, logger = mainLogger }) {
67846
- var _a;
67937
+ var _a, _b;
67847
67938
  logger = logger.extend(mainLogger);
67848
67939
  logger.log('Command "takeSnapshots" is called with settings', settings);
67849
67940
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
@@ -67876,7 +67967,7 @@ var require_take_snapshots2 = __commonJS({
67876
67967
  },
67877
67968
  logger
67878
67969
  });
67879
- snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({
67970
+ const takeSnapshotsSettings = {
67880
67971
  driver,
67881
67972
  settings: {
67882
67973
  waitBeforeCapture: settings.waitBeforeCapture,
@@ -67892,7 +67983,23 @@ var require_take_snapshots2 = __commonJS({
67892
67983
  getIOSDevices: ufgClient.getIOSDevices
67893
67984
  },
67894
67985
  logger
67895
- });
67986
+ };
67987
+ try {
67988
+ snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)(takeSnapshotsSettings);
67989
+ } catch (err) {
67990
+ if ((_b = err === null || err === void 0 ? void 0 : err.message) === null || _b === void 0 ? void 0 : _b.includes("stale element")) {
67991
+ snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({
67992
+ ...takeSnapshotsSettings,
67993
+ settings: await (0, filterStaleElements_1.removeStaleElementsFromDomSnapshotsSettings)({
67994
+ settings: takeSnapshotsSettings.settings,
67995
+ context: currentContext,
67996
+ targetElement: elementReferences.target
67997
+ })
67998
+ });
67999
+ } else {
68000
+ throw err;
68001
+ }
68002
+ }
67896
68003
  } else {
67897
68004
  const nmlClient = await core.getNMLClient({
67898
68005
  driver,
@@ -68134,15 +68241,20 @@ var require_requests3 = __commonJS({
68134
68241
  __setModuleDefault(result, mod);
68135
68242
  return result;
68136
68243
  };
68244
+ var __importDefault = exports && exports.__importDefault || function(mod) {
68245
+ return mod && mod.__esModule ? mod : { "default": mod };
68246
+ };
68137
68247
  Object.defineProperty(exports, "__esModule", { value: true });
68138
- exports.makeUFGRequests = void 0;
68248
+ exports.toServerEnvironment = exports.makeUFGRequests = void 0;
68139
68249
  var logger_1 = require_browser6();
68140
68250
  var req_ufg_1 = require_req_ufg();
68141
68251
  var to_render_result_1 = require_to_render_result();
68142
68252
  var utils34 = __importStar(require_browser3());
68253
+ var throat_1 = __importDefault(require_throat());
68143
68254
  function makeUFGRequests({ settings, logger }) {
68144
68255
  const mainLogger = (0, logger_1.makeLogger)({ logger, format: { label: "ufg-requests" } });
68145
68256
  const req2 = (0, req_ufg_1.makeReqUFG)({ settings, logger: mainLogger });
68257
+ const callRenderThrottled = (0, throat_1.default)(5, callRender);
68146
68258
  const defaultAgentId = settings.agentId;
68147
68259
  const getChromeEmulationDevicesWithCache = utils34.general.cachify(getChromeEmulationDevices);
68148
68260
  const getIOSDevicesWithCache = utils34.general.cachify(getIOSDevices);
@@ -68157,64 +68269,72 @@ var require_requests3 = __commonJS({
68157
68269
  getIOSDevices: getIOSDevicesWithCache,
68158
68270
  getAndroidDevices: getAndroidDevicesWithCache
68159
68271
  };
68272
+ async function callRender(chunk) {
68273
+ const res = await req2("./render", {
68274
+ name: "startRenders",
68275
+ method: "POST",
68276
+ body: chunk,
68277
+ expected: 200,
68278
+ logger
68279
+ });
68280
+ return res;
68281
+ }
68160
68282
  async function startRenders({ renders, logger: logger2 = mainLogger }) {
68161
68283
  logger2 = logger2.extend(mainLogger, { tags: [`start-render-request-${utils34.general.shortid()}`] });
68162
68284
  logger2.log('Request "startRenders" called for requests', renders);
68163
- const response = await req2("./render", {
68164
- name: "startRenders",
68165
- method: "POST",
68166
- body: renders.map(({ target, settings: settings2 }) => {
68167
- var _a;
68168
- const renderOptions = {
68169
- url: target.source,
68170
- snapshot: target.snapshot,
68171
- resources: target.resources,
68172
- selectorsToFindRegionsFor: (_a = settings2.selectorsToCalculate) === null || _a === void 0 ? void 0 : _a.map(toServerSelector),
68173
- options: settings2.ufgOptions,
68174
- scriptHooks: settings2.hooks,
68175
- agentId: defaultAgentId,
68176
- prefixRenderId: settings2.prefixRenderId,
68177
- webhook: settings2.uploadUrl,
68178
- stitchingService: settings2.stitchingServiceUrl,
68179
- sendDom: settings2.sendDom,
68180
- includeFullPageSize: settings2.includeFullPageSize,
68181
- enableMultipleResultsPerSelector: true,
68182
- ...toServerEnvironment(settings2.environment)
68183
- };
68184
- if (utils34.types.has(settings2.environment, "type") && settings2.environment.type === "native") {
68185
- renderOptions.renderInfo.vhsType = target.vhsType;
68186
- renderOptions.renderInfo.vhsCompatibilityParams = target.vhsCompatibilityParams;
68187
- renderOptions.renderInfo.stitchMode = settings2.stitchMode;
68188
- }
68189
- if (settings2.region) {
68190
- if (utils34.types.has(settings2.region, ["x", "y", "width", "height"])) {
68191
- renderOptions.renderInfo.target = "region";
68192
- renderOptions.renderInfo.region = settings2.region;
68193
- } else {
68194
- renderOptions.renderInfo.target = settings2.fully ? "full-selector" : "selector";
68195
- renderOptions.renderInfo.selector = toServerSelector(settings2.region);
68196
- }
68285
+ const rendersOptions = renders.map(({ target, settings: settings2 }) => {
68286
+ var _a;
68287
+ const renderOptions = {
68288
+ url: target.source,
68289
+ snapshot: target.snapshot,
68290
+ resources: target.resources,
68291
+ selectorsToFindRegionsFor: (_a = settings2.selectorsToCalculate) === null || _a === void 0 ? void 0 : _a.map(toServerSelector),
68292
+ options: settings2.ufgOptions,
68293
+ scriptHooks: settings2.hooks,
68294
+ agentId: defaultAgentId,
68295
+ prefixRenderId: settings2.prefixRenderId,
68296
+ webhook: settings2.uploadUrl,
68297
+ stitchingService: settings2.stitchingServiceUrl,
68298
+ sendDom: settings2.sendDom,
68299
+ includeFullPageSize: settings2.includeFullPageSize,
68300
+ enableMultipleResultsPerSelector: true,
68301
+ ...toServerEnvironment(settings2.environment)
68302
+ };
68303
+ if (utils34.types.has(settings2.environment, "type") && settings2.environment.type === "native") {
68304
+ renderOptions.renderInfo.vhsType = target.vhsType;
68305
+ renderOptions.renderInfo.vhsCompatibilityParams = target.vhsCompatibilityParams;
68306
+ renderOptions.renderInfo.stitchMode = settings2.stitchMode;
68307
+ }
68308
+ if (settings2.region) {
68309
+ if (utils34.types.has(settings2.region, ["x", "y", "width", "height"])) {
68310
+ renderOptions.renderInfo.target = "region";
68311
+ renderOptions.renderInfo.region = settings2.region;
68197
68312
  } else {
68198
- renderOptions.renderInfo.target = settings2.fully ? "full-page" : "viewport";
68199
- if (utils34.types.has(settings2.environment, "type") && settings2.environment.type === "native") {
68200
- renderOptions.renderInfo.selector = settings2.scrollRootElement;
68201
- }
68313
+ renderOptions.renderInfo.target = settings2.fully ? "full-selector" : "selector";
68314
+ renderOptions.renderInfo.selector = toServerSelector(settings2.region);
68202
68315
  }
68203
- return renderOptions;
68204
- }),
68205
- expected: 200,
68206
- logger: logger2
68316
+ } else {
68317
+ renderOptions.renderInfo.target = settings2.fully ? "full-page" : "viewport";
68318
+ if (utils34.types.has(settings2.environment, "type") && settings2.environment.type === "native") {
68319
+ renderOptions.renderInfo.selector = settings2.scrollRootElement;
68320
+ }
68321
+ }
68322
+ return renderOptions;
68207
68323
  });
68208
- const results = await response.json().then((results2) => {
68209
- return results2.map((result) => {
68210
- return {
68211
- jobId: result.jobId,
68212
- renderId: result.renderId,
68213
- status: result.renderStatus,
68214
- needMoreResources: result.needMoreResources,
68215
- needMoreDom: result.needMoreDom
68216
- };
68217
- });
68324
+ const chunks = [...Array(Math.ceil(rendersOptions.length / 50))].map((_) => rendersOptions.splice(0, 50));
68325
+ const chunksResponse = await Promise.all(chunks.map(async (chunk) => {
68326
+ const response2 = await callRenderThrottled(chunk);
68327
+ return response2.json();
68328
+ }));
68329
+ const response = chunksResponse.flat();
68330
+ const results = response.map((result) => {
68331
+ return {
68332
+ jobId: result.jobId,
68333
+ renderId: result.renderId,
68334
+ status: result.renderStatus,
68335
+ needMoreResources: result.needMoreResources,
68336
+ needMoreDom: result.needMoreDom
68337
+ };
68218
68338
  });
68219
68339
  logger2.log('Request "startRenders" finished successfully with body', results);
68220
68340
  return results;
@@ -68287,32 +68407,35 @@ var require_requests3 = __commonJS({
68287
68407
  async function getActualEnvironments({ settings: settings2, logger: logger2 = mainLogger }) {
68288
68408
  logger2 = logger2.extend(mainLogger, { tags: [`get-actual-environments-${utils34.general.shortid()}`] });
68289
68409
  logger2.log('Request "getActualEnvironments" called for with settings', settings2);
68290
- const response = await req2("./job-info", {
68291
- name: "getActualEnvironments",
68292
- method: "POST",
68293
- body: settings2.map((settings3) => {
68294
- const renderOptions = {
68295
- agentId: defaultAgentId,
68296
- webhook: "",
68297
- stitchingService: "",
68298
- ...toServerEnvironment(settings3.environment)
68299
- };
68300
- renderOptions.renderInfo.target = "viewport";
68301
- return renderOptions;
68302
- }),
68303
- expected: 200,
68304
- logger: logger2
68305
- });
68306
- const results = await response.json().then((results2) => {
68307
- return results2.map((result, index) => {
68308
- var _a;
68309
- return {
68310
- requested: (_a = settings2[index]) === null || _a === void 0 ? void 0 : _a.environment,
68311
- environmentId: utils34.general.guid(),
68312
- rawEnvironment: result.eyesEnvironment
68313
- };
68410
+ const results = await utils34.general.dedupAndMap(settings2, async (settings3) => {
68411
+ const response = await req2("./job-info", {
68412
+ name: "getActualEnvironments",
68413
+ method: "POST",
68414
+ body: settings3.map((settings4) => {
68415
+ const renderOptions = {
68416
+ agentId: defaultAgentId,
68417
+ webhook: "",
68418
+ stitchingService: "",
68419
+ ...toServerEnvironment(settings4.environment)
68420
+ };
68421
+ renderOptions.renderInfo.target = "viewport";
68422
+ return renderOptions;
68423
+ }),
68424
+ expected: 200,
68425
+ logger: logger2
68314
68426
  });
68315
- });
68427
+ const results2 = await response.json().then((results3) => {
68428
+ return results3.map((result, index) => {
68429
+ var _a;
68430
+ return {
68431
+ requested: (_a = settings3[index]) === null || _a === void 0 ? void 0 : _a.environment,
68432
+ environmentId: utils34.general.guid(),
68433
+ rawEnvironment: result.eyesEnvironment
68434
+ };
68435
+ });
68436
+ });
68437
+ return results2;
68438
+ }, utils34.general.deepEqual);
68316
68439
  logger2.log('Request "getActualEnvironments" finished successfully with body', results);
68317
68440
  return results;
68318
68441
  }
@@ -68345,17 +68468,23 @@ var require_requests3 = __commonJS({
68345
68468
  function toServerEnvironment(environment) {
68346
68469
  var _a, _b;
68347
68470
  if (utils34.types.has(environment, ["width", "height"])) {
68471
+ if (!environment.name) {
68472
+ throw new Error("Expected browser name to be defined when width and height are defined");
68473
+ }
68348
68474
  return {
68349
68475
  platform: { name: "linux", type: "web" },
68350
68476
  browser: {
68351
- name: environment.name.replace(/(one|two)-versions?-back$/, (_, num) => num === "one" ? "1" : "2")
68477
+ name: replaceVersionsBack(environment.name)
68352
68478
  },
68353
68479
  renderInfo: { width: environment.width, height: environment.height }
68354
68480
  };
68355
68481
  } else if (utils34.types.has(environment, "chromeEmulationInfo")) {
68482
+ if (environment.name && !environment.name.includes("chrome")) {
68483
+ throw new Error("Expected browser name to be undefined or chrome when chromeEmulationInfo is defined");
68484
+ }
68356
68485
  return {
68357
68486
  platform: { name: "linux", type: "web" },
68358
- browser: { name: "chrome" },
68487
+ browser: { name: replaceVersionsBack((_a = environment.name) !== null && _a !== void 0 ? _a : "chrome") },
68359
68488
  renderInfo: {
68360
68489
  emulationInfo: {
68361
68490
  deviceName: environment.chromeEmulationInfo.deviceName,
@@ -68365,7 +68494,7 @@ var require_requests3 = __commonJS({
68365
68494
  };
68366
68495
  } else if (utils34.types.has(environment, "androidDeviceInfo")) {
68367
68496
  return {
68368
- platform: { name: "android", type: (_a = environment.type) !== null && _a !== void 0 ? _a : "native" },
68497
+ platform: { name: "android", type: (_b = environment.type) !== null && _b !== void 0 ? _b : "native" },
68369
68498
  browser: environment.type === "web" ? { name: "chrome" } : void 0,
68370
68499
  renderInfo: {
68371
68500
  androidDeviceInfo: {
@@ -68377,8 +68506,8 @@ var require_requests3 = __commonJS({
68377
68506
  };
68378
68507
  } else if (utils34.types.has(environment, "iosDeviceInfo")) {
68379
68508
  return {
68380
- platform: { name: "ios", type: (_b = environment.type) !== null && _b !== void 0 ? _b : "web" },
68381
- browser: environment.type === "web" ? { name: "safari" } : void 0,
68509
+ platform: { name: "ios", type: "web" },
68510
+ browser: { name: "safari" },
68382
68511
  renderInfo: {
68383
68512
  iosDeviceInfo: {
68384
68513
  name: environment.iosDeviceInfo.deviceName,
@@ -68388,7 +68517,11 @@ var require_requests3 = __commonJS({
68388
68517
  }
68389
68518
  };
68390
68519
  }
68520
+ function replaceVersionsBack(name) {
68521
+ return name.replace(/(one|two)-versions?-back$/, (_, num) => num === "one" ? "1" : "2");
68522
+ }
68391
68523
  }
68524
+ exports.toServerEnvironment = toServerEnvironment;
68392
68525
  function toServerSelector(selector) {
68393
68526
  var _a;
68394
68527
  if (utils34.types.isString(selector))
@@ -68682,7 +68815,6 @@ var require_create_render_target = __commonJS({
68682
68815
  processResources({
68683
68816
  resources: Object.fromEntries([
68684
68817
  ...((_a = snapshot.resourceUrls) !== null && _a !== void 0 ? _a : []).map((url) => {
68685
- url = replaceResourceUrlIfNeeded(url, replaceResourceUrlsSettings);
68686
68818
  return [url, (0, resource_1.makeResource)({ url, environment: settings === null || settings === void 0 ? void 0 : settings.environment })];
68687
68819
  }),
68688
68820
  ...Object.entries((_b = snapshot.resourceContents) !== null && _b !== void 0 ? _b : {}).map(([url, resource]) => {
@@ -68702,7 +68834,8 @@ var require_create_render_target = __commonJS({
68702
68834
  ]),
68703
68835
  settings: {
68704
68836
  ...settings,
68705
- headers: { ...settings === null || settings === void 0 ? void 0 : settings.headers, Referer: utils34.types.has(snapshot, "url") ? snapshot.url : void 0 }
68837
+ headers: { ...settings === null || settings === void 0 ? void 0 : settings.headers, Referer: utils34.types.has(snapshot, "url") ? snapshot.url : void 0 },
68838
+ getUrlForUrlResource: replaceResourceUrlsSettings ? (url) => replaceResourceUrlIfNeeded(url, replaceResourceUrlsSettings) : void 0
68706
68839
  },
68707
68840
  logger
68708
68841
  }),
@@ -68714,7 +68847,12 @@ var require_create_render_target = __commonJS({
68714
68847
  const frameUrl = replaceResourceUrlIfNeeded(snapshot.frames[index].url, replaceResourceUrlsSettings);
68715
68848
  return Object.assign(mapping, { [frameUrl]: resources.mapping[frameUrl] });
68716
68849
  }, {});
68717
- const resourceMappingWithoutDom = { ...snapshotResources.mapping, ...frameDomResourceMapping };
68850
+ const snapshotResourcesMapping = Object.keys(snapshotResources.mapping).reduce((mapping, resourceUrl) => {
68851
+ const url = replaceResourceUrlIfNeeded(resourceUrl, replaceResourceUrlsSettings);
68852
+ mapping[url] = snapshotResources.mapping[resourceUrl];
68853
+ return mapping;
68854
+ }, {});
68855
+ const resourceMappingWithoutDom = { ...snapshotResourcesMapping, ...frameDomResourceMapping };
68718
68856
  if (utils34.types.has(snapshot, "url"))
68719
68857
  snapshot.url = replaceResourceUrlIfNeeded(snapshot.url, replaceResourceUrlsSettings);
68720
68858
  const domResource = utils34.types.has(snapshot, "cdt") ? {
@@ -85828,6 +85966,9 @@ var require_process_resources = __commonJS({
85828
85966
  async function doProcessUrlResourceWithDependencies(resource2) {
85829
85967
  const processedResource = await processUrlResource({ resource: resource2, settings, logger });
85830
85968
  if (processedResource) {
85969
+ if (settings === null || settings === void 0 ? void 0 : settings.getUrlForUrlResource) {
85970
+ resource2.url = settings.getUrlForUrlResource(resource2.url);
85971
+ }
85831
85972
  processedResourcesWithDependencies[resource2.url] = processedResource;
85832
85973
  if (processedResource.dependencies) {
85833
85974
  const dependencyResources = processedResource.dependencies.flatMap((dependencyUrl) => {
@@ -88635,6 +88776,27 @@ var require_types9 = __commonJS({
88635
88776
  init_buffer();
88636
88777
  init_setInterval();
88637
88778
  Object.defineProperty(exports, "__esModule", { value: true });
88779
+ exports.BrowserNameEnum = void 0;
88780
+ var BrowserNameEnum;
88781
+ (function(BrowserNameEnum2) {
88782
+ BrowserNameEnum2["CHROME"] = "chrome";
88783
+ BrowserNameEnum2["CHROME_ONE_VERSION_BACK"] = "chrome-one-version-back";
88784
+ BrowserNameEnum2["CHROME_TWO_VERSIONS_BACK"] = "chrome-two-versions-back";
88785
+ BrowserNameEnum2["FIREFOX"] = "firefox";
88786
+ BrowserNameEnum2["FIREFOX_ONE_VERSION_BACK"] = "firefox-one-version-back";
88787
+ BrowserNameEnum2["FIREFOX_TWO_VERSIONS_BACK"] = "firefox-two-versions-back";
88788
+ BrowserNameEnum2["IE_11"] = "ie";
88789
+ BrowserNameEnum2["IE_10"] = "ie10";
88790
+ BrowserNameEnum2["EDGE"] = "edge";
88791
+ BrowserNameEnum2["EDGE_CHROMIUM"] = "edgechromium";
88792
+ BrowserNameEnum2["EDGE_LEGACY"] = "edgelegacy";
88793
+ BrowserNameEnum2["EDGE_CHROMIUM_ONE_VERSION_BACK"] = "edgechromium-one-version-back";
88794
+ BrowserNameEnum2["EDGE_CHROMIUM_TWO_VERSIONS_BACK"] = "edgechromium-two-versions-back";
88795
+ BrowserNameEnum2["SAFARI"] = "safari";
88796
+ BrowserNameEnum2["SAFARI_EARLY_ACCESS"] = "safari-earlyaccess";
88797
+ BrowserNameEnum2["SAFARI_ONE_VERSION_BACK"] = "safari-one-version-back";
88798
+ BrowserNameEnum2["SAFARI_TWO_VERSIONS_BACK"] = "safari-two-versions-back";
88799
+ })(BrowserNameEnum || (exports.BrowserNameEnum = BrowserNameEnum = {}));
88638
88800
  }
88639
88801
  });
88640
88802
 
@@ -89320,6 +89482,108 @@ var require_extract_default_environment = __commonJS({
89320
89482
  }
89321
89483
  });
89322
89484
 
89485
+ // ../core/dist/ufg/utils/verify-environment-info.js
89486
+ var require_verify_environment_info = __commonJS({
89487
+ "../core/dist/ufg/utils/verify-environment-info.js"(exports) {
89488
+ "use strict";
89489
+ init_process();
89490
+ init_setImmediate();
89491
+ init_buffer();
89492
+ init_setInterval();
89493
+ var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) {
89494
+ if (k2 === void 0)
89495
+ k2 = k;
89496
+ var desc = Object.getOwnPropertyDescriptor(m, k);
89497
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
89498
+ desc = { enumerable: true, get: function() {
89499
+ return m[k];
89500
+ } };
89501
+ }
89502
+ Object.defineProperty(o, k2, desc);
89503
+ } : function(o, m, k, k2) {
89504
+ if (k2 === void 0)
89505
+ k2 = k;
89506
+ o[k2] = m[k];
89507
+ });
89508
+ var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) {
89509
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
89510
+ } : function(o, v) {
89511
+ o["default"] = v;
89512
+ });
89513
+ var __importStar = exports && exports.__importStar || function(mod) {
89514
+ if (mod && mod.__esModule)
89515
+ return mod;
89516
+ var result = {};
89517
+ if (mod != null) {
89518
+ for (var k in mod)
89519
+ if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
89520
+ __createBinding(result, mod, k);
89521
+ }
89522
+ __setModuleDefault(result, mod);
89523
+ return result;
89524
+ };
89525
+ Object.defineProperty(exports, "__esModule", { value: true });
89526
+ exports.verifyEnvironmentsInfo = void 0;
89527
+ var utils34 = __importStar(require_browser3());
89528
+ var ufg_client_1 = require_dist6();
89529
+ async function verifyEnvironmentsInfo({ environments, ufgClient }) {
89530
+ const invalid = [];
89531
+ await Promise.all(environments.map(async (environment) => {
89532
+ if (utils34.types.has(environment, ["width", "height"])) {
89533
+ const browserName = environment.name || "";
89534
+ if (!getAllBrowserNames().includes(browserName)) {
89535
+ invalid.push(browserName);
89536
+ }
89537
+ } else if (utils34.types.has(environment, "chromeEmulationInfo")) {
89538
+ const devices = await ufgClient.getChromeEmulationDevices();
89539
+ const deviceName = environment.chromeEmulationInfo.deviceName;
89540
+ if (!devices[deviceName]) {
89541
+ invalid.push(deviceName);
89542
+ }
89543
+ } else if (utils34.types.has(environment, "iosDeviceInfo")) {
89544
+ const devices = await ufgClient.getIOSDevices();
89545
+ const deviceName = environment.iosDeviceInfo.deviceName;
89546
+ if (!devices[deviceName]) {
89547
+ invalid.push(deviceName);
89548
+ }
89549
+ }
89550
+ }));
89551
+ if (invalid.length > 0) {
89552
+ throw new Error(`The specified UFG environment(s): ${invalid.map((item) => `"${item}"`).join(", ")} are either invalid or no longer supported.
89553
+ Refer to our current list of supported devices and browsers at: https://applitools.com/tutorials/concepts/test-execution/ultrafast-grid-devices-browsers
89554
+ If you continue to experience issues, ensure that your SDK is updated to the latest version.`);
89555
+ }
89556
+ }
89557
+ exports.verifyEnvironmentsInfo = verifyEnvironmentsInfo;
89558
+ function getAllBrowserNames() {
89559
+ return [
89560
+ ...Object.values(ufg_client_1.BrowserNameEnum),
89561
+ "chrome-1",
89562
+ "firefox-1",
89563
+ "edgechromium-1",
89564
+ "safari-1",
89565
+ "chrome-2",
89566
+ "firefox-2",
89567
+ "edgechromium-2",
89568
+ "safari-2",
89569
+ "chrome-canary",
89570
+ "firefox-canary",
89571
+ "edgechromium-canary",
89572
+ "safari-canary",
89573
+ "chrome-one-versions-back",
89574
+ "firefox-one-versions-back",
89575
+ "edgechromium-one-versions-back",
89576
+ "safari-one-versions-back",
89577
+ "chrome-two-version-back",
89578
+ "firefox-two-version-back",
89579
+ "edgechromium-two-version-back",
89580
+ "safari-two-version-back",
89581
+ "ie11"
89582
+ ];
89583
+ }
89584
+ }
89585
+ });
89586
+
89323
89587
  // ../core/dist/ufg/open-eyes.js
89324
89588
  var require_open_eyes3 = __commonJS({
89325
89589
  "../core/dist/ufg/open-eyes.js"(exports) {
@@ -89370,11 +89634,12 @@ var require_open_eyes3 = __commonJS({
89370
89634
  var abort_1 = require_abort2();
89371
89635
  var get_results_1 = require_get_results2();
89372
89636
  var extract_default_environment_1 = require_extract_default_environment();
89637
+ var verify_environment_info_1 = require_verify_environment_info();
89373
89638
  var abort_controller_1 = (init_abort_controller(), __toCommonJS(abort_controller_exports));
89374
89639
  var utils34 = __importStar(require_browser3());
89375
89640
  function makeOpenEyes({ core, spec, logger: mainLogger }) {
89376
89641
  return async function openEyes({ target, settings, storage = /* @__PURE__ */ new Map(), logger = mainLogger }) {
89377
- var _a, _b, _c;
89642
+ var _a, _b, _c, _d;
89378
89643
  logger = logger.extend(mainLogger);
89379
89644
  logger.log(`Command "openEyes" is called with ${target ? "default driver" : ""}`, ...settings ? ["and settings", settings] : [], storage.size > 0 ? "and default eyes storage" : "");
89380
89645
  const driver = target && await (0, driver_1.makeDriver)({ spec, driver: target, logger });
@@ -89392,8 +89657,17 @@ var require_open_eyes3 = __commonJS({
89392
89657
  const controller = new abort_controller_1.AbortController();
89393
89658
  const { signal } = controller;
89394
89659
  const account = await core.getAccountInfo({ settings, logger });
89660
+ const ufgClient = await core.getUFGClient({
89661
+ settings: {
89662
+ ...account.ufgServer,
89663
+ eyesServerUrl: account.eyesServer.eyesServerUrl,
89664
+ apiKey: account.eyesServer.apiKey
89665
+ },
89666
+ logger
89667
+ });
89668
+ await (0, verify_environment_info_1.verifyEnvironmentsInfo)({ environments: (_d = settings.environments) !== null && _d !== void 0 ? _d : [], ufgClient });
89395
89669
  return utils34.general.extend({}, (eyes) => {
89396
- var _a2, _b2, _c2, _d;
89670
+ var _a2, _b2, _c2, _d2;
89397
89671
  return {
89398
89672
  type: "ufg",
89399
89673
  core,
@@ -89403,7 +89677,7 @@ var require_open_eyes3 = __commonJS({
89403
89677
  batchBuildId: (_b2 = settings.batch) === null || _b2 === void 0 ? void 0 : _b2.buildId,
89404
89678
  keepBatchOpen: settings.keepBatchOpen,
89405
89679
  eyesServer: account.eyesServer,
89406
- ufgServer: { ...account.ufgServer, ufgServerUrl: (_c2 = settings.ufgServerUrl) !== null && _c2 !== void 0 ? _c2 : (_d = account.ufgServer) === null || _d === void 0 ? void 0 : _d.ufgServerUrl },
89680
+ ufgServer: { ...account.ufgServer, ufgServerUrl: (_c2 = settings.ufgServerUrl) !== null && _c2 !== void 0 ? _c2 : (_d2 = account.ufgServer) === null || _d2 === void 0 ? void 0 : _d2.ufgServerUrl },
89407
89681
  uploadUrl: account.uploadUrl,
89408
89682
  stitchingServiceUrl: account.stitchingServiceUrl,
89409
89683
  supportedEnvironmentsUrl: account.supportedEnvironmentsUrl,
@@ -90508,31 +90782,31 @@ var require_open_eyes4 = __commonJS({
90508
90782
  var extract_git_info_1 = require_extract_git_info();
90509
90783
  function makeOpenEyes({ type: defaultType = "classic", clients, batch, removeDuplicateTests, core, cores, spec, environment, logger: mainLogger, asyncCache, cwd = process.cwd() }) {
90510
90784
  return async function openEyes({ type = defaultType, settings: openSettings, config, target, logger = mainLogger }) {
90511
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
90512
- var _w, _x, _y, _z, _0;
90785
+ 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, _1;
90786
+ var _2, _3, _4, _5, _6;
90513
90787
  logger = logger.extend(mainLogger, { tags: [`eyes-${type}-${utils34.general.shortid()}`] });
90514
- const settings = { ...config === null || config === void 0 ? void 0 : config.open, ...openSettings };
90788
+ const settings = { environments: config === null || config === void 0 ? void 0 : config.check.environments, ...config === null || config === void 0 ? void 0 : config.open, ...openSettings };
90515
90789
  const eyesServerSettings = (0, populate_eyes_server_settings_1.populateEyesServerSettings)(settings);
90516
90790
  logger.mask(eyesServerSettings.apiKey);
90517
90791
  logger.mask(eyesServerSettings.eyesServerUrl);
90518
90792
  (_a = settings.userTestId) !== null && _a !== void 0 ? _a : settings.userTestId = `${settings.testName}--${utils34.general.guid()}`;
90519
90793
  settings.batch = { ...batch, ...settings.batch };
90520
- (_b = (_w = settings.batch).id) !== null && _b !== void 0 ? _b : _w.id = (_c = utils34.general.getEnvValue("BATCH_ID")) !== null && _c !== void 0 ? _c : `generated-${utils34.general.guid()}`;
90521
- (_d = (_x = settings.batch).buildId) !== null && _d !== void 0 ? _d : _x.buildId = utils34.general.getEnvValue("BATCH_BUILD_ID");
90522
- (_e = (_y = settings.batch).name) !== null && _e !== void 0 ? _e : _y.name = utils34.general.getEnvValue("BATCH_NAME");
90523
- (_f = (_z = settings.batch).sequenceName) !== null && _f !== void 0 ? _f : _z.sequenceName = utils34.general.getEnvValue("BATCH_SEQUENCE");
90524
- (_g = (_0 = settings.batch).notifyOnCompletion) !== null && _g !== void 0 ? _g : _0.notifyOnCompletion = utils34.general.getEnvValue("BATCH_NOTIFY", "boolean");
90794
+ (_b = (_2 = settings.batch).id) !== null && _b !== void 0 ? _b : _2.id = (_c = utils34.general.getEnvValue("BATCH_ID")) !== null && _c !== void 0 ? _c : `generated-${utils34.general.guid()}`;
90795
+ (_d = (_3 = settings.batch).buildId) !== null && _d !== void 0 ? _d : _3.buildId = utils34.general.getEnvValue("BATCH_BUILD_ID");
90796
+ (_e = (_4 = settings.batch).name) !== null && _e !== void 0 ? _e : _4.name = utils34.general.getEnvValue("BATCH_NAME");
90797
+ (_f = (_5 = settings.batch).sequenceName) !== null && _f !== void 0 ? _f : _5.sequenceName = utils34.general.getEnvValue("BATCH_SEQUENCE");
90798
+ (_g = (_6 = settings.batch).notifyOnCompletion) !== null && _g !== void 0 ? _g : _6.notifyOnCompletion = utils34.general.getEnvValue("BATCH_NOTIFY", "boolean");
90525
90799
  (_h = settings.keepBatchOpen) !== null && _h !== void 0 ? _h : settings.keepBatchOpen = utils34.general.getEnvValue("DONT_CLOSE_BATCHES", "boolean");
90526
- (_j = settings.branchName) !== null && _j !== void 0 ? _j : settings.branchName = utils34.general.getEnvValue("BRANCH");
90527
- (_k = settings.parentBranchName) !== null && _k !== void 0 ? _k : settings.parentBranchName = utils34.general.getEnvValue("PARENT_BRANCH");
90528
- (_l = settings.baselineBranchName) !== null && _l !== void 0 ? _l : settings.baselineBranchName = utils34.general.getEnvValue("BASELINE_BRANCH");
90529
- (_m = settings.gitBranchingTimestamp) !== null && _m !== void 0 ? _m : settings.gitBranchingTimestamp = utils34.general.getEnvValue("GIT_MERGE_BASE_TIMESTAMP");
90530
- (_o = settings.latestCommitInfo) !== null && _o !== void 0 ? _o : settings.latestCommitInfo = getLatestCommitInfoFromEnvVars(logger);
90531
- (_p = settings.ufgServerUrl) !== null && _p !== void 0 ? _p : settings.ufgServerUrl = utils34.general.getEnvValue("UFG_SERVER_URL");
90532
- (_q = settings.ignoreBaseline) !== null && _q !== void 0 ? _q : settings.ignoreBaseline = false;
90533
- (_r = settings.compareWithParentBranch) !== null && _r !== void 0 ? _r : settings.compareWithParentBranch = false;
90534
- (_s = settings.removeDuplicateTests) !== null && _s !== void 0 ? _s : settings.removeDuplicateTests = removeDuplicateTests;
90535
- (_t = settings.latestCommitInfo) !== null && _t !== void 0 ? _t : settings.latestCommitInfo = await (0, extract_git_info_1.extractLatestCommitInfo)({ execOptions: { cwd }, logger });
90800
+ (_j = settings.branchName) !== null && _j !== void 0 ? _j : settings.branchName = (_k = utils34.general.getEnvValue("BRANCH")) !== null && _k !== void 0 ? _k : utils34.general.getEnvValue("BRANCH_NAME");
90801
+ (_l = settings.parentBranchName) !== null && _l !== void 0 ? _l : settings.parentBranchName = (_m = utils34.general.getEnvValue("PARENT_BRANCH")) !== null && _m !== void 0 ? _m : utils34.general.getEnvValue("PARENT_BRANCH_NAME");
90802
+ (_o = settings.baselineBranchName) !== null && _o !== void 0 ? _o : settings.baselineBranchName = (_p = utils34.general.getEnvValue("BASELINE_BRANCH")) !== null && _p !== void 0 ? _p : utils34.general.getEnvValue("BASELINE_BRANCH_NAME");
90803
+ (_q = settings.gitBranchingTimestamp) !== null && _q !== void 0 ? _q : settings.gitBranchingTimestamp = utils34.general.getEnvValue("GIT_MERGE_BASE_TIMESTAMP");
90804
+ (_r = settings.latestCommitInfo) !== null && _r !== void 0 ? _r : settings.latestCommitInfo = getLatestCommitInfoFromEnvVars(logger);
90805
+ (_s = settings.ufgServerUrl) !== null && _s !== void 0 ? _s : settings.ufgServerUrl = utils34.general.getEnvValue("UFG_SERVER_URL");
90806
+ (_t = settings.ignoreBaseline) !== null && _t !== void 0 ? _t : settings.ignoreBaseline = false;
90807
+ (_u = settings.compareWithParentBranch) !== null && _u !== void 0 ? _u : settings.compareWithParentBranch = false;
90808
+ (_v = settings.removeDuplicateTests) !== null && _v !== void 0 ? _v : settings.removeDuplicateTests = removeDuplicateTests;
90809
+ (_w = settings.latestCommitInfo) !== null && _w !== void 0 ? _w : settings.latestCommitInfo = await (0, extract_git_info_1.extractLatestCommitInfo)({ execOptions: { cwd }, logger });
90536
90810
  if (settings.latestCommitInfo && !(0, extract_git_info_1.isISODate)(settings.latestCommitInfo.timestamp)) {
90537
90811
  logger.warn(`latestCommitInfo.timestamp is an invalid ISO date string: ${settings.latestCommitInfo.timestamp}`);
90538
90812
  settings.latestCommitInfo = void 0;
@@ -90560,6 +90834,15 @@ var require_open_eyes4 = __commonJS({
90560
90834
  const driver = target && await (0, driver_1.makeDriver)({ spec, driver: target, logger, customConfig: settings });
90561
90835
  const driverEnvironment = await (driver === null || driver === void 0 ? void 0 : driver.getEnvironment());
90562
90836
  const driverUrl = await (driver === null || driver === void 0 ? void 0 : driver.getDriverUrl());
90837
+ const multiDeviceTargets = [];
90838
+ for (const checkEnv of (_x = settings.environments) !== null && _x !== void 0 ? _x : []) {
90839
+ if (utils34.types.has(checkEnv, "iosDeviceInfo") && ((_y = driverEnvironment === null || driverEnvironment === void 0 ? void 0 : driverEnvironment.applitoolsLib) === null || _y === void 0 ? void 0 : _y.instrumented)) {
90840
+ multiDeviceTargets.push({
90841
+ deviceInfo: checkEnv.iosDeviceInfo.deviceName,
90842
+ orientation: (_z = checkEnv.iosDeviceInfo.screenOrientation) !== null && _z !== void 0 ? _z : "portrait"
90843
+ });
90844
+ }
90845
+ }
90563
90846
  void core.logEvent({
90564
90847
  settings: {
90565
90848
  ...settings,
@@ -90567,7 +90850,7 @@ var require_open_eyes4 = __commonJS({
90567
90850
  event: {
90568
90851
  type: "openEyes",
90569
90852
  userTestId: settings.userTestId,
90570
- concurrency: (_u = cores === null || cores === void 0 ? void 0 : cores[type].concurrency) !== null && _u !== void 0 ? _u : core.concurrency,
90853
+ concurrency: (_0 = cores === null || cores === void 0 ? void 0 : cores[type].concurrency) !== null && _0 !== void 0 ? _0 : core.concurrency,
90571
90854
  environment,
90572
90855
  driver: {
90573
90856
  deviceName: driverEnvironment === null || driverEnvironment === void 0 ? void 0 : driverEnvironment.deviceName,
@@ -90575,10 +90858,11 @@ var require_open_eyes4 = __commonJS({
90575
90858
  browserVersion: driverEnvironment === null || driverEnvironment === void 0 ? void 0 : driverEnvironment.browserVersion,
90576
90859
  platformName: driverEnvironment === null || driverEnvironment === void 0 ? void 0 : driverEnvironment.platformName,
90577
90860
  platformVersion: driverEnvironment === null || driverEnvironment === void 0 ? void 0 : driverEnvironment.platformVersion,
90578
- isApplitoolsLib: (_v = driverEnvironment === null || driverEnvironment === void 0 ? void 0 : driverEnvironment.applitoolsLib) === null || _v === void 0 ? void 0 : _v.instrumented,
90861
+ isApplitoolsLib: (_1 = driverEnvironment === null || driverEnvironment === void 0 ? void 0 : driverEnvironment.applitoolsLib) === null || _1 === void 0 ? void 0 : _1.instrumented,
90579
90862
  isEC: driverEnvironment === null || driverEnvironment === void 0 ? void 0 : driverEnvironment.isEC
90580
90863
  },
90581
- driverUrl
90864
+ driverUrl,
90865
+ multiDeviceTargets
90582
90866
  }
90583
90867
  },
90584
90868
  logger
@@ -91191,7 +91475,7 @@ var require_package2 = __commonJS({
91191
91475
  "../core/package.json"(exports, module) {
91192
91476
  module.exports = {
91193
91477
  name: "@applitools/core",
91194
- version: "4.31.0",
91478
+ version: "4.32.2",
91195
91479
  homepage: "https://applitools.com",
91196
91480
  bugs: {
91197
91481
  url: "https://github.com/applitools/eyes.sdk.javascript1/issues"
@@ -95498,8 +95782,14 @@ var require_run_offline_snapshots = __commonJS({
95498
95782
  var utils34 = __importStar(require_browser3());
95499
95783
  var merge_configs_1 = require_merge_configs();
95500
95784
  var format_results_1 = require_format_results();
95785
+ var throat_1 = __importDefault(require_throat());
95786
+ function getConsoleLogLimit() {
95787
+ var _a;
95788
+ return (_a = utils34.general.getEnvValue("OFFLINE_LOG_LIMIT", "number")) !== null && _a !== void 0 ? _a : 20;
95789
+ }
95501
95790
  async function runOfflineSnapshots(options) {
95502
95791
  var _a;
95792
+ const limitConsoleLogs = getConsoleLogLimit();
95503
95793
  if (!options.offlineLocationPath)
95504
95794
  throw new Error("offlineLocationPath is required");
95505
95795
  const offlineLocationPath = path_1.default.resolve(options.offlineLocationPath);
@@ -95536,13 +95826,27 @@ var require_run_offline_snapshots = __commonJS({
95536
95826
  return allTestResults;
95537
95827
  async function runTests(testFolders2) {
95538
95828
  logger.log("running tests", testFolders2);
95539
- const results = await Promise.all(testFolders2.map(async (testFolder) => {
95829
+ const messages = [];
95830
+ const testPromises = testFolders2.map(async (testFolder) => {
95540
95831
  const testLogger = logger.extend({ tags: [testFolder] });
95541
95832
  const testPath = path_1.default.join(offlineLocationPath, testFolder);
95542
95833
  const fileOpenSettings = await fs_1.default.promises.readFile(path_1.default.join(testPath, "settings.json"), "utf-8").then(JSON.parse);
95543
95834
  const openSettings = (0, merge_configs_1.mergeConfigs)(fileOpenSettings, options.config.open);
95544
- logger.console.log(`Running test: ${openSettings.testName} (${formatEnvironment(openSettings.environment)})`);
95545
- return runTest(testPath, openSettings, testLogger);
95835
+ messages.push(`Running test: ${openSettings.testName} (${formatEnvironment(openSettings.environment)})`);
95836
+ return { testPath, openSettings, testLogger };
95837
+ });
95838
+ const preparedTests = await Promise.all(testPromises);
95839
+ if (messages.length > limitConsoleLogs) {
95840
+ const slice = messages.slice(0, limitConsoleLogs);
95841
+ logger.console.log(slice.join("\n") + `
95842
+ ... ${messages.length - limitConsoleLogs} more tests`);
95843
+ } else {
95844
+ logger.console.log(messages.join("\n"));
95845
+ }
95846
+ const testConcurrency = utils34.general.getEnvValue("TEST_CONCURRENCY", "number");
95847
+ const runTestThrottled = testConcurrency ? (0, throat_1.default)(testConcurrency, runTest) : runTest;
95848
+ const results = await Promise.all(preparedTests.map(async ({ testPath, openSettings, testLogger }) => {
95849
+ return runTestThrottled(testPath, openSettings, testLogger);
95546
95850
  }));
95547
95851
  const batchIds = [...new Set(results.map((t) => t.batchId))];
95548
95852
  const allTestResults2 = results.map((t) => t.results);
@@ -95550,8 +95854,8 @@ var require_run_offline_snapshots = __commonJS({
95550
95854
  const keepBatchOpen = utils34.general.getEnvValue("DONT_CLOSE_BATCHES", "boolean") || options.config.open.keepBatchOpen;
95551
95855
  if (!keepBatchOpen) {
95552
95856
  await core.closeBatch({ settings: batchIds.map((batchId) => ({ batchId, ...account.eyesServer })) });
95857
+ logger.log("done closing batches");
95553
95858
  }
95554
- logger.log("done closing batches");
95555
95859
  return allTestResults2;
95556
95860
  }
95557
95861
  async function runTest(testPath, openSettings, logger2) {
@@ -95569,20 +95873,25 @@ var require_run_offline_snapshots = __commonJS({
95569
95873
  },
95570
95874
  logger: logger2
95571
95875
  });
95572
- const checkFolders = (await fs_1.default.promises.readdir(testPath)).filter((folderpath) => folderpath.startsWith("check-"));
95573
- logger2.log("running checks for test", testPath, ":", checkFolders);
95574
- const targets = await Promise.all(checkFolders.map(async (checkFolder) => {
95575
- const snapshot = await fs_1.default.promises.readFile(path_1.default.resolve(testPath, checkFolder, "snapshot.json"), "utf-8").then(JSON.parse);
95576
- snapshot.settings.environment.environmentId = utils34.general.guid();
95577
- return snapshot;
95578
- }));
95579
- await uploadResources(targets, logger2);
95580
- logger2.log("uploaded resources for test", testPath);
95581
- await Promise.all(targets.map((target, index) => runCheck(eyes, target, index, logger2)));
95582
- const fileCloseSettings = await fs_1.default.promises.readFile(path_1.default.resolve(testPath, "close.json"), "utf-8").then(JSON.parse);
95583
- const closeSettings = (0, merge_configs_1.mergeConfigs)(fileCloseSettings, options.config.close);
95584
- await eyes.close({ settings: closeSettings });
95585
- logger2.log("done running test", logger2);
95876
+ const closeSettingsPath = path_1.default.resolve(testPath, "close.json");
95877
+ if (fs_1.default.existsSync(closeSettingsPath)) {
95878
+ const checkFolders = (await fs_1.default.promises.readdir(testPath)).filter((folderpath) => folderpath.startsWith("check-"));
95879
+ logger2.log("running checks for test", testPath, ":", checkFolders);
95880
+ const targets = await Promise.all(checkFolders.map(async (checkFolder) => {
95881
+ const snapshot = await fs_1.default.promises.readFile(path_1.default.resolve(testPath, checkFolder, "snapshot.json"), "utf-8").then(JSON.parse);
95882
+ snapshot.settings.environment.environmentId = utils34.general.guid();
95883
+ return snapshot;
95884
+ }));
95885
+ await uploadResources(targets, logger2);
95886
+ logger2.log("uploaded resources for test", testPath);
95887
+ await Promise.all(targets.map((target, index) => runCheck(eyes, target, index, logger2)));
95888
+ const fileCloseSettings = await fs_1.default.promises.readFile(closeSettingsPath, "utf-8").then(JSON.parse);
95889
+ const closeSettings = (0, merge_configs_1.mergeConfigs)(fileCloseSettings, options.config.close);
95890
+ await eyes.close({ settings: closeSettings });
95891
+ } else {
95892
+ await eyes.abort();
95893
+ }
95894
+ logger2.log("done running test", testPath);
95586
95895
  return { batchId: openSettings.batch.id, results: (await eyes.getResults({ logger: logger2 }))[0] };
95587
95896
  }
95588
95897
  async function uploadResources(targets, logger2) {
@@ -95686,16 +95995,16 @@ var require_run_offline_snapshots = __commonJS({
95686
95995
  }
95687
95996
  outputStr += "[EYES: TEST RESULTS]:\n\n";
95688
95997
  if (passedOrNew.length > 0) {
95689
- outputStr += testResultsOutput(passedOrNew, warnForUnsavedNewTests);
95998
+ outputStr += testResultsOutput(passedOrNew, warnForUnsavedNewTests, "Passed");
95690
95999
  }
95691
96000
  if (failedTests.length > 0) {
95692
- outputStr += testResultsOutput(failedTests, warnForUnsavedNewTests);
96001
+ outputStr += testResultsOutput(failedTests, warnForUnsavedNewTests, "Failed");
95693
96002
  }
95694
96003
  if (unresolved.length > 0) {
95695
- outputStr += testResultsOutput(unresolved, warnForUnsavedNewTests);
96004
+ outputStr += testResultsOutput(unresolved, warnForUnsavedNewTests, "Unresolved");
95696
96005
  }
95697
96006
  if (aborted.length > 0) {
95698
- outputStr += testResultsOutput(aborted, warnForUnsavedNewTests);
96007
+ outputStr += testResultsOutput(aborted, warnForUnsavedNewTests, "Aborted");
95699
96008
  }
95700
96009
  if (errors.length) {
95701
96010
  const sortedErrors = errors.sort((a, b) => a.title.localeCompare(b.title));
@@ -95759,29 +96068,40 @@ Total time: ${Math.round(totalTime / 1e3)} seconds
95759
96068
  isSuccess
95760
96069
  };
95761
96070
  }
95762
- function testResultsOutput(results, warnForUnsavedNewTests) {
95763
- let outputStr = "";
96071
+ function testResultsOutput(results, warnForUnsavedNewTests, tag) {
96072
+ const limitConsoleLogs = getConsoleLogLimit();
96073
+ const truncated = [];
96074
+ let limitCount = 0;
95764
96075
  const sortedTestResults = results.sort((a, b) => a.name.localeCompare(b.name));
95765
96076
  sortedTestResults.forEach((result) => {
95766
96077
  const testTitle = `${result.name} [${result.hostApp}] [${result.hostDisplaySize.width}x${result.hostDisplaySize.height}] - `;
95767
96078
  if (result.isAborted) {
95768
- outputStr += `${testTitle}${chalk_1.default.keyword("red")(`Aborted`)}
96079
+ const str = `${testTitle}${chalk_1.default.keyword("red")(`Aborted`)}
95769
96080
  `;
96081
+ truncated.push(str);
95770
96082
  } else if (result.isNew) {
95771
96083
  const newResColor = warnForUnsavedNewTests ? "orange" : "blue";
95772
- outputStr += `${testTitle}${chalk_1.default.keyword(newResColor)("New")}
96084
+ const str = `${testTitle}${chalk_1.default.keyword(newResColor)("New")}
95773
96085
  `;
96086
+ truncated.push(str);
95774
96087
  } else if (result.status === "Passed") {
95775
- outputStr += `${testTitle}${chalk_1.default.green("Passed")}
96088
+ const str = `${testTitle}${chalk_1.default.green("Passed")}
95776
96089
  `;
96090
+ truncated.push(str);
95777
96091
  } else if (result.status === "Failed") {
95778
- outputStr += `${testTitle}${chalk_1.default.keyword("red")("Failed")}
96092
+ const str = `${testTitle}${chalk_1.default.keyword("red")("Failed")}
95779
96093
  `;
96094
+ truncated.push(str);
95780
96095
  } else {
95781
- outputStr += `${testTitle}${chalk_1.default.keyword("orange")(`Unresolved`)}
96096
+ const str = `${testTitle}${chalk_1.default.keyword("orange")(`Unresolved`)}
95782
96097
  `;
96098
+ truncated.push(str);
95783
96099
  }
96100
+ if (limitCount < limitConsoleLogs)
96101
+ limitCount++;
95784
96102
  });
96103
+ let outputStr = truncated.slice(0, limitConsoleLogs).join("");
96104
+ outputStr += results.length - limitCount > 0 ? `... ${results.length - limitCount} more ${tag} tests` : "";
95785
96105
  outputStr += "\n";
95786
96106
  return outputStr;
95787
96107
  }
@@ -95873,7 +96193,7 @@ var require_package3 = __commonJS({
95873
96193
  "../eyes/package.json"(exports, module) {
95874
96194
  module.exports = {
95875
96195
  name: "@applitools/eyes",
95876
- version: "1.32.0",
96196
+ version: "1.32.6",
95877
96197
  keywords: [
95878
96198
  "applitools",
95879
96199
  "eyes",
@@ -97912,6 +98232,10 @@ var CheckSettingsAutomationFluent = class extends CheckSettingsBaseFluent {
97912
98232
  this._settings.densityMetrics = options;
97913
98233
  return this;
97914
98234
  }
98235
+ stitchMode(stitchMode) {
98236
+ this._settings.stitchMode = stitchMode;
98237
+ return this;
98238
+ }
97915
98239
  /** @internal */
97916
98240
  toJSON() {
97917
98241
  var _a, _b, _c, _d, _e, _f, _g, _h, _i;
@@ -97950,7 +98274,8 @@ var CheckSettingsAutomationFluent = class extends CheckSettingsBaseFluent {
97950
98274
  retryTimeout: this._settings.timeout,
97951
98275
  userCommandId: this._settings.variationGroupId,
97952
98276
  densityMetrics: this._settings.densityMetrics,
97953
- assumesMutability: this.assumesMutability()
98277
+ assumesMutability: this.assumesMutability(),
98278
+ stitchMode: this._settings.stitchMode
97954
98279
  })
97955
98280
  };
97956
98281
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/eyes-browser",
3
- "version": "1.4.21",
3
+ "version": "1.4.22",
4
4
  "keywords": [
5
5
  "applitools",
6
6
  "browser",
@@ -48,7 +48,7 @@
48
48
  "test": "run --top-level mocha './test/**/*.spec.ts'"
49
49
  },
50
50
  "dependencies": {
51
- "@applitools/eyes": "1.32.0"
51
+ "@applitools/eyes": "1.32.6"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/node": "^12.20.55",
@@ -10,6 +10,7 @@ import { LazyLoadOptions } from './LazyLoadOptions';
10
10
  import { DensityMetrics } from './DensityMetrics';
11
11
  import * as utils from '@applitools/utils';
12
12
  import { DynamicTextType } from '../enums/DynamicTextType';
13
+ import { type StitchMode } from '../enums/StitchMode';
13
14
  type RegionReference<TSpec extends Core.SpecType> = Region | LegacyRegion | ElementReference<TSpec>;
14
15
  type ElementReference<TSpec extends Core.SpecType> = TSpec['element'] | SelectorReference<TSpec>;
15
16
  type SelectorReference<TSpec extends Core.SpecType> = EyesSelector<TSpec['selector']>;
@@ -70,6 +71,7 @@ export type CheckSettingsBase<TRegion = never> = {
70
71
  pageId?: string;
71
72
  variationGroupId?: string;
72
73
  densityMetrics?: DensityMetrics;
74
+ stitchMode?: StitchMode;
73
75
  };
74
76
  export type CheckSettingsImage = CheckSettingsBase;
75
77
  export type CheckSettingsAutomation<TSpec extends Core.SpecType> = CheckSettingsBase<RegionReference<TSpec>> & {
@@ -233,6 +235,7 @@ export declare class CheckSettingsAutomationFluent<TSpec extends Core.SpecType =
233
235
  waitBeforeCapture(waitBeforeCapture: number): typeof this;
234
236
  lazyLoad(options?: LazyLoadOptions | boolean): typeof this;
235
237
  densityMetrics(options: DensityMetrics): typeof this;
238
+ stitchMode(stitchMode: StitchMode): typeof this;
236
239
  /** @internal */
237
240
  toJSON(): {
238
241
  target: undefined;