@applitools/eyes-cypress 3.32.2 → 3.33.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
@@ -12,6 +12,14 @@
12
12
 
13
13
 
14
14
 
15
+ ## 3.33.0 - 2023/5/23
16
+
17
+ ### Features
18
+ - Add support for reloading the page when using layoutBreakpoints
19
+ - Internal improvements
20
+ - Start universal core in the plugin process
21
+ ### Bug fixes
22
+
15
23
  ## 3.32.2 - 2023/5/3
16
24
 
17
25
  ### Features
@@ -10,6 +10,9 @@ function executeScript(context, script, arg) {
10
10
  const prepScirpt = script.replace('function(arg)', 'function func(arg)');
11
11
  scriptToExecute = prepScirpt.concat(' return func(arg)');
12
12
  }
13
+ if (!context.defaultView) {
14
+ context = fallBackToMainContext();
15
+ }
13
16
  const executor = new context.defaultView.Function('arg', scriptToExecute);
14
17
  return executor(arg);
15
18
  }
@@ -22,6 +25,9 @@ function parentContext(context) {
22
25
  if (!context) {
23
26
  throw new Error('Context is not accessible');
24
27
  }
28
+ else if (!context.defaultView) {
29
+ return fallBackToMainContext();
30
+ }
25
31
  return context === mainContext() ? context : context.defaultView.frameElement.ownerDocument;
26
32
  }
27
33
  exports.parentContext = parentContext;
@@ -87,6 +93,9 @@ function getTitle(context) {
87
93
  }
88
94
  exports.getTitle = getTitle;
89
95
  function getUrl(context) {
96
+ if (context && !context.location) {
97
+ context = fallBackToMainContext();
98
+ }
90
99
  return context.location.href;
91
100
  }
92
101
  exports.getUrl = getUrl;
@@ -94,3 +103,8 @@ function getCookies() {
94
103
  return Cypress.automation('get:cookies', {});
95
104
  }
96
105
  exports.getCookies = getCookies;
106
+ function fallBackToMainContext() {
107
+ const context = mainContext();
108
+ context['applitools-marker'] = 'root-context';
109
+ return context;
110
+ }
@@ -35,7 +35,11 @@ function transformCypressCheckSettings(settings, refer) {
35
35
  renderers: (0, utils_1.transformBrowsers)(settings.browser),
36
36
  hooks: settings.scriptHooks,
37
37
  disableBrowserFetching: settings.disableBrowserFetching,
38
- layoutBreakpoints: settings.layoutBreakpoints,
38
+ layoutBreakpoints: settings.layoutBreakpoints
39
+ ? utils.types.has(settings.layoutBreakpoints, 'breakpoints')
40
+ ? settings.layoutBreakpoints
41
+ : { breakpoints: settings.layoutBreakpoints }
42
+ : undefined,
39
43
  ufgOptions: settings.visualGridOptions,
40
44
  name: settings.tag,
41
45
  ignoreRegions: transformRegionsWithOptions(settings.ignore),
@@ -1,7 +1,31 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.transformCypressConfig = void 0;
4
27
  const utils_1 = require("./utils");
28
+ const utils = __importStar(require("@applitools/utils"));
5
29
  function transformCypressConfig(config) {
6
30
  var _a, _b, _c, _d, _e, _f, _g, _h;
7
31
  return {
@@ -39,7 +63,11 @@ function transformCypressConfig(config) {
39
63
  ignoreCaret: config.ignoreCaret,
40
64
  ignoreDisplacements: config.ignoreDisplacements,
41
65
  accessibilitySettings: (0, utils_1.transformAccessibilityValidation)(config.accessibilityValidation),
42
- layoutBreakpoints: config.layoutBreakpoints,
66
+ layoutBreakpoints: config.layoutBreakpoints
67
+ ? utils.types.has(config.layoutBreakpoints, 'breakpoints')
68
+ ? config.layoutBreakpoints
69
+ : { breakpoints: config.layoutBreakpoints }
70
+ : undefined,
43
71
  sendDom: config.sendDom,
44
72
  useDom: config.useDom,
45
73
  enablePatterns: config.enablePatterns,
@@ -12,7 +12,6 @@ const path_1 = require("path");
12
12
  function printTestResults(testResultsArr) {
13
13
  const logger = (0, logger_1.makeLogger)({
14
14
  level: testResultsArr.resultConfig.showLogs ? 'info' : 'silent',
15
- label: 'eyes',
16
15
  });
17
16
  if (!testResultsArr.testResults)
18
17
  return;
@@ -8,8 +8,8 @@ const config_1 = __importDefault(require("./config"));
8
8
  const server_1 = __importDefault(require("./server"));
9
9
  const logger_1 = require("@applitools/logger");
10
10
  const { config, eyesConfig } = (0, config_1.default)();
11
- const logger = (0, logger_1.makeLogger)({ level: config.showLogs ? 'info' : 'silent', label: 'eyes' });
12
- const startServer = (0, server_1.default)({ logger, eyesConfig });
11
+ const logger = (0, logger_1.makeLogger)({ level: config.showLogs ? 'info' : 'silent' });
12
+ const startServer = (0, server_1.default)({ logger, eyesConfig, config });
13
13
  const pluginExport = (0, pluginExport_1.default)({
14
14
  startServer,
15
15
  eyesConfig: Object.assign({}, eyesConfig, { appliConfFile: config }),
@@ -8,12 +8,11 @@ const core_1 = require("@applitools/core");
8
8
  const handleTestResults_1 = __importDefault(require("./handleTestResults"));
9
9
  const path_1 = __importDefault(require("path"));
10
10
  const fs_1 = __importDefault(require("fs"));
11
- const semver_1 = require("semver");
12
11
  const https_1 = require("https");
13
12
  const ws_1 = require("ws");
14
- const which_1 = __importDefault(require("which"));
15
13
  const util_1 = require("util");
16
- function makeStartServer({ logger, eyesConfig }) {
14
+ const PUBLIC_CLOUD = 'https://eyesapi.applitools.com';
15
+ function makeStartServer({ logger, eyesConfig, config, }) {
17
16
  return async function startServer(options) {
18
17
  const key = fs_1.default.readFileSync(path_1.default.resolve(__dirname, '../../src/pem/server.key'));
19
18
  const cert = fs_1.default.readFileSync(path_1.default.resolve(__dirname, '../../src/pem/server.cert'));
@@ -24,20 +23,13 @@ function makeStartServer({ logger, eyesConfig }) {
24
23
  await (0, util_1.promisify)(https.listen.bind(https))();
25
24
  const port = https.address().port;
26
25
  const wss = new ws_1.Server({ server: https, path: '/eyes', maxPayload: 254 * 1024 * 1024 });
27
- wss.on('close', () => https.close());
28
- const forkOptions = {
29
- detached: true,
30
- };
31
- const cypressVersion = require('cypress/package.json').version;
32
- const isCypressVersionBelow7 = (0, semver_1.lt)(cypressVersion, '7.0.0');
33
- const isNodeVersionSystem = !!(options === null || options === void 0 ? void 0 : options.nodeVersion) && options.nodeVersion !== 'system';
34
- if (isCypressVersionBelow7 || isNodeVersionSystem) {
35
- forkOptions.execPath = await (0, which_1.default)('node');
36
- }
37
- const { port: universalPort, close: closeUniversalServer } = await (0, core_1.makeCoreServerProcess)({
26
+ wss.on('close', () => {
27
+ https.close();
28
+ closeUniversalServer();
29
+ });
30
+ const { port: universalPort, close: closeUniversalServer } = await (0, core_1.makeCoreServer)({
38
31
  idleTimeout: 0,
39
- shutdownMode: 'stdin',
40
- forkOptions,
32
+ printStdout: true,
41
33
  singleton: false,
42
34
  portResolutionMode: 'random',
43
35
  debug: eyesConfig.universalDebug,
@@ -57,6 +49,24 @@ function makeStartServer({ logger, eyesConfig }) {
57
49
  socketWithClient.on('message', (message) => {
58
50
  const msg = JSON.parse(message);
59
51
  logger.log('==> ', message.toString().slice(0, 1000));
52
+ if (msg.name === 'Core.makeCore') {
53
+ logger.log('==> ', 'Core.logEvent');
54
+ socketWithUniversal.request('Core.logEvent', {
55
+ settings: {
56
+ serverUrl: config.serverUrl ? config.serverUrl : PUBLIC_CLOUD,
57
+ apiKey: config.apiKey,
58
+ agentId: `eyes.cypress/${require('../../package.json').version}`,
59
+ proxy: config.proxy,
60
+ level: 'Notice',
61
+ event: {
62
+ type: 'CypressTestingType',
63
+ testingType: (options === null || options === void 0 ? void 0 : options.testingType) === 'component' ? 'component' : 'e2e',
64
+ cypressVersion: require('cypress/package.json').version,
65
+ },
66
+ },
67
+ logger,
68
+ });
69
+ }
60
70
  if (msg.name === 'Core.makeSDK') {
61
71
  const newMessage = Buffer.from(JSON.stringify({
62
72
  name: msg.name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/eyes-cypress",
3
- "version": "3.32.2",
3
+ "version": "3.33.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git://github.com/applitools/eyes.sdk.javascript1.git",
@@ -47,7 +47,7 @@
47
47
  "cypress12": "./node_modules/cypress12/bin/cypress",
48
48
  "test:ts:run:12": "yarn cypress12 run --project ./test/e2e/ts --config-file ./cypress-12.config.ts",
49
49
  "test:ts:run": "yarn test:ts:run:legacy && yarn test:ts:run:9",
50
- "test:coverage": "yarn generate:tests && cd test/coverage/generic && yarn && APPLITOOLS_BATCH_NAME='JS Coverage Tests: eyes-cypress' APPLITOOLS_BATCH_ID=$(uuidgen) npx cypress run",
50
+ "test:coverage": "yarn generate:tests && cd test/coverage/generic && yarn && unset APPLITOOLS_API_KEY && APPLITOOLS_BATCH_NAME='JS Coverage Tests: eyes-cypress' APPLITOOLS_BATCH_ID=$(uuidgen) npx cypress run",
51
51
  "test:e2e": "mkdir -p test/fixtures/testAppCopies && mocha --no-timeouts 'test/e2e/**/*.test.js'",
52
52
  "test:components": "cd test/components && yarn && npx cypress run --component",
53
53
  "cypress": "cypress open --config-file test/fixtures/cypress-play.json",
@@ -69,29 +69,27 @@
69
69
  }
70
70
  },
71
71
  "dependencies": {
72
- "@applitools/core": "2.5.10",
73
- "@applitools/eyes-api": "1.13.12",
72
+ "@applitools/core": "3.1.0",
73
+ "@applitools/eyes": "1.2.13",
74
74
  "@applitools/functional-commons": "1.6.0",
75
- "@applitools/logger": "1.1.52",
76
- "@applitools/utils": "1.3.35",
75
+ "@applitools/logger": "2.0.1",
76
+ "@applitools/utils": "1.3.37",
77
77
  "boxen": "5.1.2",
78
78
  "chalk": "3.0.0",
79
79
  "semver": "7.3.8",
80
80
  "uuid": "8.3.2",
81
- "which": "2.0.2",
82
81
  "ws": "8.5.0"
83
82
  },
84
83
  "devDependencies": {
85
84
  "@applitools/api-extractor": "^1.2.21",
86
- "@applitools/bongo": "^3.0.3",
85
+ "@applitools/bongo": "^3.0.4",
87
86
  "@applitools/sdk-coverage-tests": "^3.0.2",
88
87
  "@applitools/snaptdout": "1.0.1",
89
- "@applitools/test-server": "1.1.31",
90
- "@applitools/test-utils": "1.5.16",
88
+ "@applitools/test-server": "1.2.1",
89
+ "@applitools/test-utils": "1.5.17",
91
90
  "@types/node": "12",
92
91
  "@types/semver": "^7.3.13",
93
92
  "@types/uuid": "^9.0.0",
94
- "@types/which": "^2.0.1",
95
93
  "@types/ws": "^8.2.2",
96
94
  "chai": "4.2.0",
97
95
  "chai-spies": "1.0.0",
@@ -4,7 +4,7 @@ const spec = require('../../dist/browser/spec-driver')
4
4
  const Refer = require('./refer')
5
5
  const Socket = require('./socket')
6
6
  const {socketCommands} = require('./socketCommands')
7
- const {TestResultsSummary} = require('@applitools/eyes-api')
7
+ const {TestResultsSummaryData: TestResultsSummary} = require('@applitools/eyes/dist/output/TestResultsSummary')
8
8
  const refer = new Refer()
9
9
  const socket = new Socket()
10
10
  const throwErr = Cypress.config('failCypressOnDiff')
@@ -11,7 +11,10 @@ export function executeScript(context: Context, script: string, arg: any): any {
11
11
  const prepScirpt = script.replace('function(arg)', 'function func(arg)')
12
12
  scriptToExecute = prepScirpt.concat(' return func(arg)')
13
13
  }
14
-
14
+ if (!context.defaultView) {
15
+ // after reload the window is null
16
+ context = fallBackToMainContext()
17
+ }
15
18
  const executor = new context.defaultView.Function('arg', scriptToExecute)
16
19
  return executor(arg)
17
20
  }
@@ -25,6 +28,9 @@ export function parentContext(context: Context): Context {
25
28
  // because Cypress doesn't support cross origin iframe, then childContext might return null, and then the input to parentContext might be null
26
29
  if (!context) {
27
30
  throw new Error('Context is not accessible')
31
+ } else if (!context.defaultView) {
32
+ // after reload the window is null
33
+ return fallBackToMainContext()
28
34
  }
29
35
 
30
36
  return context === mainContext() ? context : context.defaultView.frameElement.ownerDocument
@@ -92,6 +98,10 @@ export function getTitle(context: Context): string {
92
98
  }
93
99
 
94
100
  export function getUrl(context: Context): string {
101
+ if (context && !context.location) {
102
+ // after reload, the location is null
103
+ context = fallBackToMainContext()
104
+ }
95
105
  return context.location.href
96
106
  }
97
107
 
@@ -100,6 +110,13 @@ export function getCookies(): Array<any> {
100
110
  return Cypress.automation('get:cookies', {})
101
111
  }
102
112
 
113
+ function fallBackToMainContext(): Context {
114
+ const context = mainContext()
115
+ //@ts-ignore
116
+ context['applitools-marker'] = 'root-context'
117
+ return context
118
+ }
119
+
103
120
  // export function takeScreenshot(page: Driver): Promise<Buffer>;
104
121
 
105
122
  // export function visit(page: Driver, url: string): Promise<void>; (??)
@@ -26,7 +26,11 @@ export function transformCypressCheckSettings(settings: CypressCheckSettings, re
26
26
  renderers: transformBrowsers(settings.browser),
27
27
  hooks: settings.scriptHooks,
28
28
  disableBrowserFetching: settings.disableBrowserFetching,
29
- layoutBreakpoints: settings.layoutBreakpoints,
29
+ layoutBreakpoints: settings.layoutBreakpoints
30
+ ? utils.types.has(settings.layoutBreakpoints, 'breakpoints')
31
+ ? settings.layoutBreakpoints
32
+ : {breakpoints: settings.layoutBreakpoints}
33
+ : undefined,
30
34
  ufgOptions: settings.visualGridOptions,
31
35
  name: settings.tag,
32
36
  ignoreRegions: transformRegionsWithOptions(settings.ignore),
@@ -1,6 +1,7 @@
1
1
  import type {CypressEyesConfig} from '../expose'
2
2
  import type {SpecType, Config} from '@applitools/core'
3
3
  import {transformBrowsers, transformAccessibilityValidation} from './utils'
4
+ import * as utils from '@applitools/utils'
4
5
 
5
6
  export function transformCypressConfig(config: CypressEyesConfig): Config<SpecType, 'ufg'> {
6
7
  return {
@@ -38,7 +39,11 @@ export function transformCypressConfig(config: CypressEyesConfig): Config<SpecTy
38
39
  ignoreCaret: config.ignoreCaret,
39
40
  ignoreDisplacements: config.ignoreDisplacements,
40
41
  accessibilitySettings: transformAccessibilityValidation(config.accessibilityValidation),
41
- layoutBreakpoints: config.layoutBreakpoints,
42
+ layoutBreakpoints: config.layoutBreakpoints
43
+ ? utils.types.has(config.layoutBreakpoints, 'breakpoints')
44
+ ? config.layoutBreakpoints
45
+ : {breakpoints: config.layoutBreakpoints}
46
+ : undefined,
42
47
  sendDom: config.sendDom,
43
48
  useDom: config.useDom,
44
49
  enablePatterns: config.enablePatterns,
package/src/expose.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  * correct types for the SDK just like all other conventional SDK's.
8
8
  **/
9
9
  /// <reference types="cypress" />
10
- import type * as api from '@applitools/eyes-api'
10
+ import type * as api from '@applitools/eyes'
11
11
  import type * as core from '@applitools/core'
12
12
  import {
13
13
  type EyesSelector,
@@ -15,7 +15,7 @@ import {
15
15
  type DeviceName,
16
16
  type ScreenOrientationPlain,
17
17
  type AccessibilityRegionTypePlain,
18
- } from '@applitools/eyes-api'
18
+ } from '@applitools/eyes'
19
19
 
20
20
  export type MaybeArray<T> = T | T[]
21
21
  export type {EyesSelector, TestResultsStatus, DeviceName, ScreenOrientationPlain}
@@ -8,7 +8,6 @@ import {resolve} from 'path'
8
8
  function printTestResults(testResultsArr: any) {
9
9
  const logger = makeLogger({
10
10
  level: testResultsArr.resultConfig.showLogs ? 'info' : 'silent',
11
- label: 'eyes',
12
11
  })
13
12
  if (!testResultsArr.testResults) return
14
13
  const {passed, failed, diffs} = getErrorsAndDiffs(testResultsArr.testResults)
@@ -28,9 +28,9 @@ export type EyesPluginConfig = {
28
28
  }
29
29
 
30
30
  const {config, eyesConfig} = makeConfig()
31
- const logger = makeLogger({level: config.showLogs ? 'info' : 'silent', label: 'eyes'})
31
+ const logger = makeLogger({level: config.showLogs ? 'info' : 'silent'})
32
32
 
33
- const startServer = makeStartServer({logger, eyesConfig})
33
+ const startServer = makeStartServer({logger, eyesConfig, config})
34
34
 
35
35
  const pluginExport = makePluginExport({
36
36
  startServer,
@@ -1,16 +1,15 @@
1
1
  import connectSocket, {type SocketWithUniversal} from './webSocket'
2
- import {type CloseBatchSettings, makeCoreServerProcess} from '@applitools/core'
2
+ import {type CloseBatchSettings, makeCoreServer} from '@applitools/core'
3
3
  import handleTestResults from './handleTestResults'
4
4
  import path from 'path'
5
5
  import fs from 'fs'
6
- import {lt as semverLt} from 'semver'
7
6
  import {Server as HttpsServer} from 'https'
8
7
  import {Server as WSServer} from 'ws'
9
- import which from 'which'
10
8
  import {type Logger} from '@applitools/logger'
11
9
  import {AddressInfo} from 'net'
12
10
  import {promisify} from 'util'
13
11
  import {EyesPluginConfig} from './index'
12
+
14
13
  export type StartServerReturn = {
15
14
  server: Omit<SocketWithUniversal, 'disconnect' | 'ref' | 'unref' | 'send' | 'request' | 'setPassthroughListener'>
16
15
  port: number
@@ -18,8 +17,16 @@ export type StartServerReturn = {
18
17
  closeBatches: (settings: CloseBatchSettings | CloseBatchSettings[]) => Promise<void>
19
18
  closeUniversalServer: () => void
20
19
  }
21
-
22
- export default function makeStartServer({logger, eyesConfig}: {logger: Logger; eyesConfig: EyesPluginConfig}) {
20
+ const PUBLIC_CLOUD = 'https://eyesapi.applitools.com'
21
+ export default function makeStartServer({
22
+ logger,
23
+ eyesConfig,
24
+ config,
25
+ }: {
26
+ logger: Logger
27
+ eyesConfig: EyesPluginConfig
28
+ config: any
29
+ }) {
23
30
  return async function startServer(options?: Cypress.PluginConfigOptions): Promise<StartServerReturn> {
24
31
  const key = fs.readFileSync(path.resolve(__dirname, '../../src/pem/server.key'))
25
32
  const cert = fs.readFileSync(path.resolve(__dirname, '../../src/pem/server.cert'))
@@ -32,39 +39,14 @@ export default function makeStartServer({logger, eyesConfig}: {logger: Logger; e
32
39
  const port = (https.address() as AddressInfo).port
33
40
  const wss = new WSServer({server: https, path: '/eyes', maxPayload: 254 * 1024 * 1024})
34
41
 
35
- wss.on('close', () => https.close())
36
-
37
- const forkOptions: {
38
- detached: boolean
39
- execPath?: string
40
- } = {
41
- detached: true,
42
- }
43
-
44
- const cypressVersion = require('cypress/package.json').version
45
-
46
- // `cypress` version below `7.0.0` has an old Electron version which not support async shell process.
47
- // By passing `execPath` with the node process cwd it will switch the `node` process to be the like the OS have
48
- // and will not use the unsupported `Cypress Helper.app` with the not supported shell process Electron
49
- const isCypressVersionBelow7 = semverLt(cypressVersion, '7.0.0')
50
-
51
- // `nodeVersion` property set the way the `node` process will be executed
52
- // if set to `system` it will use the `node` process that the OS have
53
- // if set to `bundled` it will use the `node` process that the `Cypress Helper.app` have
54
- //
55
- // [doc link](https://docs.cypress.io/guides/references/configuration#Node-version)
56
- //
57
- // this is why if `nodeVersion` exits and not set to `system` we need to tell to the `universal` server the `execPath` to `node`
58
- const isNodeVersionSystem = !!options?.nodeVersion && options.nodeVersion !== 'system'
59
-
60
- if (isCypressVersionBelow7 || isNodeVersionSystem) {
61
- forkOptions.execPath = await which('node')
62
- }
42
+ wss.on('close', () => {
43
+ https.close()
44
+ closeUniversalServer()
45
+ })
63
46
 
64
- const {port: universalPort, close: closeUniversalServer} = await makeCoreServerProcess({
47
+ const {port: universalPort, close: closeUniversalServer} = await makeCoreServer({
65
48
  idleTimeout: 0,
66
- shutdownMode: 'stdin',
67
- forkOptions,
49
+ printStdout: true,
68
50
  singleton: false,
69
51
  portResolutionMode: 'random',
70
52
  debug: eyesConfig.universalDebug,
@@ -89,6 +71,24 @@ export default function makeStartServer({logger, eyesConfig}: {logger: Logger; e
89
71
  socketWithClient.on('message', (message: string) => {
90
72
  const msg = JSON.parse(message)
91
73
  logger.log('==> ', message.toString().slice(0, 1000))
74
+ if (msg.name === 'Core.makeCore') {
75
+ logger.log('==> ', 'Core.logEvent')
76
+ socketWithUniversal.request('Core.logEvent', {
77
+ settings: {
78
+ serverUrl: config.serverUrl ? config.serverUrl : PUBLIC_CLOUD,
79
+ apiKey: config.apiKey,
80
+ agentId: `eyes.cypress/${require('../../package.json').version}`,
81
+ proxy: config.proxy,
82
+ level: 'Notice',
83
+ event: {
84
+ type: 'CypressTestingType',
85
+ testingType: options?.testingType === 'component' ? 'component' : 'e2e',
86
+ cypressVersion: require('cypress/package.json').version,
87
+ },
88
+ },
89
+ logger,
90
+ })
91
+ }
92
92
  if (msg.name === 'Core.makeSDK') {
93
93
  const newMessage = Buffer.from(
94
94
  JSON.stringify({
package/types/expose.d.ts CHANGED
@@ -190,7 +190,7 @@ export type CypressCheckSettings = {
190
190
  scrollRootElement?: Element | (Selector | { selector: Selector; type?: string; shadow?: EyesSelector<Selector>; frame?: EyesSelector<Selector>; });
191
191
  fully?: boolean;
192
192
  disableBrowserFetching?: boolean;
193
- layoutBreakpoints?: boolean | Array<number>;
193
+ layoutBreakpoints?: boolean | Array<number> | { breakpoints: boolean | Array<number>; reload?: boolean; };
194
194
  visualGridOptions?: { [key: string]: any; };
195
195
  nmgOptions?: { [key: string]: any; };
196
196
  hooks?: { beforeCaptureScreenshot: string; };
@@ -331,12 +331,12 @@ export type CypressEyesConfig = {
331
331
  cut?: { top: number; right: number; bottom: number; left: number; } | { x: number; y: number; width: number; height: number; };
332
332
  rotation?: 0 | 270 | -270 | 180 | -180 | 90 | -90;
333
333
  scaleRatio?: number;
334
- waitBeforeCapture?: number;
335
334
  concurrentSessions?: number;
336
335
  browsersInfo?: Array<{ name?: "chrome" | "firefox" | "edge" | "chrome-one-version-back" | "chrome-two-versions-back" | "firefox-one-version-back" | "firefox-two-versions-back" | "ie" | "ie10" | "edgechromium" | "edgelegacy" | "edgechromium-one-version-back" | "edgechromium-two-versions-back" | "safari" | "safari-earlyaccess" | "safari-one-version-back" | "safari-two-versions-back"; width: number; height: number; } | { chromeEmulationInfo: { deviceName: "Blackberry PlayBook" | "BlackBerry Z30" | "Galaxy A5" | "Galaxy Note 10" | "Galaxy Note 10 Plus" | "Galaxy Note 2" | "Galaxy Note 3" | "Galaxy Note 4" | "Galaxy Note 8" | "Galaxy Note 9" | "Galaxy S3" | "Galaxy S5" | "Galaxy S8" | "Galaxy S8 Plus" | "Galaxy S9" | "Galaxy S9 Plus" | "Galaxy S10" | "Galaxy S10 Plus" | "Galaxy S20" | "Galaxy S22" | "Galaxy Tab S7" | "iPad" | "iPad 6th Gen" | "iPad 7th Gen" | "iPad Air 2" | "iPad Mini" | "iPad Pro" | "iPhone 11" | "iPhone 11 Pro" | "iPhone 11 Pro Max" | "iPhone 4" | "iPhone 5/SE" | "iPhone 6/7/8" | "iPhone 6/7/8 Plus" | "iPhone X" | "iPhone XR" | "iPhone XS" | "iPhone XS Max" | "Kindle Fire HDX" | "Laptop with HiDPI screen" | "Laptop with MDPI screen" | "Laptop with touch" | "LG G6" | "LG Optimus L70" | "Microsoft Lumia 550" | "Microsoft Lumia 950" | "Nexus 10" | "Nexus 4" | "Nexus 5" | "Nexus 5X" | "Nexus 6" | "Nexus 6P" | "Nexus 7" | "Nokia Lumia 520" | "Nokia N9" | "OnePlus 7T" | "OnePlus 7T Pro" | "Pixel 2" | "Pixel 2 XL" | "Pixel 3" | "Pixel 3 XL" | "Pixel 4" | "Pixel 4 XL" | "Pixel 5" | "Sony Xperia 10 II" | "Huawei Mate 50 Pro" | "Huawei Matepad 11"; screenOrientation?: ScreenOrientationPlain; }; } | { iosDeviceInfo: { deviceName: "iPhone 11" | "iPhone 11 Pro" | "iPhone 11 Pro Max" | "iPhone X" | "iPhone XR" | "iPhone 14 Pro Max" | "iPhone 14" | "iPhone 13 Pro Max" | "iPhone 13 Pro" | "iPhone 13" | "iPhone 12 Pro Max" | "iPhone 12 Pro" | "iPhone 12" | "iPhone 12 mini" | "iPhone Xs" | "iPhone 8" | "iPhone 8 Plus" | "iPhone 7" | "iPhone SE (1st generation)" | "iPad Pro (12.9-inch) (3rd generation)" | "iPad Pro (11-inch) (4th generation)" | "iPad (7th generation)" | "iPad (9th generation)" | "iPad Air (2nd generation)" | "iPad Air (4th generation)"; iosVersion?: "latest" | "latest-1"; screenOrientation?: ScreenOrientationPlain; }; } | { androidDeviceInfo: { deviceName: "Galaxy Note 10" | "Galaxy Note 10 Plus" | "Galaxy S10" | "Galaxy S10 Plus" | "Galaxy S20" | "Galaxy S22" | "Galaxy Tab S7" | "Pixel 3 XL" | "Pixel 4" | "Pixel 4 XL" | "Pixel 5" | "Sony Xperia 10 II" | "Pixel 6" | "Galaxy S20 Plus" | "Galaxy S21" | "Galaxy S21 Plus" | "Galaxy S21 Ultra" | "Galaxy S22 Plus" | "Galaxy Tab S8" | "Xiaomi Redmi Note 10 JE" | "Xiaomi Redmi Note 11" | "Xiaomi Redmi Note 11 Pro" | "Sony Xperia 1 II" | "Sony Xperia Ace II" | "Huawei P30 Lite"; version?: "latest" | "latest-1"; screenOrientation?: ScreenOrientationPlain; }; }>;
337
336
  visualGridOptions?: Record<string, any>;
338
- layoutBreakpoints?: boolean | Array<number>;
337
+ layoutBreakpoints?: boolean | Array<number> | { breakpoints: boolean | Array<number>; reload?: boolean; };
339
338
  disableBrowserFetching?: boolean;
339
+ waitBeforeCapture?: number;
340
340
  browser?: MaybeArray<{ name?: "chrome" | "firefox" | "edge" | "chrome-one-version-back" | "chrome-two-versions-back" | "firefox-one-version-back" | "firefox-two-versions-back" | "ie" | "ie10" | "edgechromium" | "edgelegacy" | "edgechromium-one-version-back" | "edgechromium-two-versions-back" | "safari" | "safari-earlyaccess" | "safari-one-version-back" | "safari-two-versions-back"; width: number; height: number; } | { chromeEmulationInfo: { deviceName: "Blackberry PlayBook" | "BlackBerry Z30" | "Galaxy A5" | "Galaxy Note 10" | "Galaxy Note 10 Plus" | "Galaxy Note 2" | "Galaxy Note 3" | "Galaxy Note 4" | "Galaxy Note 8" | "Galaxy Note 9" | "Galaxy S3" | "Galaxy S5" | "Galaxy S8" | "Galaxy S8 Plus" | "Galaxy S9" | "Galaxy S9 Plus" | "Galaxy S10" | "Galaxy S10 Plus" | "Galaxy S20" | "Galaxy S22" | "Galaxy Tab S7" | "iPad" | "iPad 6th Gen" | "iPad 7th Gen" | "iPad Air 2" | "iPad Mini" | "iPad Pro" | "iPhone 11" | "iPhone 11 Pro" | "iPhone 11 Pro Max" | "iPhone 4" | "iPhone 5/SE" | "iPhone 6/7/8" | "iPhone 6/7/8 Plus" | "iPhone X" | "iPhone XR" | "iPhone XS" | "iPhone XS Max" | "Kindle Fire HDX" | "Laptop with HiDPI screen" | "Laptop with MDPI screen" | "Laptop with touch" | "LG G6" | "LG Optimus L70" | "Microsoft Lumia 550" | "Microsoft Lumia 950" | "Nexus 10" | "Nexus 4" | "Nexus 5" | "Nexus 5X" | "Nexus 6" | "Nexus 6P" | "Nexus 7" | "Nokia Lumia 520" | "Nokia N9" | "OnePlus 7T" | "OnePlus 7T Pro" | "Pixel 2" | "Pixel 2 XL" | "Pixel 3" | "Pixel 3 XL" | "Pixel 4" | "Pixel 4 XL" | "Pixel 5" | "Sony Xperia 10 II" | "Huawei Mate 50 Pro" | "Huawei Matepad 11"; screenOrientation?: ScreenOrientationPlain; }; } | { iosDeviceInfo: { deviceName: "iPhone 11" | "iPhone 11 Pro" | "iPhone 11 Pro Max" | "iPhone X" | "iPhone XR" | "iPhone 14 Pro Max" | "iPhone 14" | "iPhone 13 Pro Max" | "iPhone 13 Pro" | "iPhone 13" | "iPhone 12 Pro Max" | "iPhone 12 Pro" | "iPhone 12" | "iPhone 12 mini" | "iPhone Xs" | "iPhone 8" | "iPhone 8 Plus" | "iPhone 7" | "iPhone SE (1st generation)" | "iPad Pro (12.9-inch) (3rd generation)" | "iPad Pro (11-inch) (4th generation)" | "iPad (7th generation)" | "iPad (9th generation)" | "iPad Air (2nd generation)" | "iPad Air (4th generation)"; iosVersion?: "latest" | "latest-1"; screenOrientation?: ScreenOrientationPlain; }; } | { androidDeviceInfo: { deviceName: "Galaxy Note 10" | "Galaxy Note 10 Plus" | "Galaxy S10" | "Galaxy S10 Plus" | "Galaxy S20" | "Galaxy S22" | "Galaxy Tab S7" | "Pixel 3 XL" | "Pixel 4" | "Pixel 4 XL" | "Pixel 5" | "Sony Xperia 10 II" | "Pixel 6" | "Galaxy S20 Plus" | "Galaxy S21" | "Galaxy S21 Plus" | "Galaxy S21 Ultra" | "Galaxy S22 Plus" | "Galaxy Tab S8" | "Xiaomi Redmi Note 10 JE" | "Xiaomi Redmi Note 11" | "Xiaomi Redmi Note 11 Pro" | "Sony Xperia 1 II" | "Sony Xperia Ace II" | "Huawei P30 Lite"; version?: "latest" | "latest-1"; screenOrientation?: ScreenOrientationPlain; }; } | { deviceName: DeviceName; screenOrientation?: ScreenOrientationPlain; name?: string; }>;
341
341
  batchId?: string;
342
342
  batchName?: string;
@@ -388,9 +388,9 @@ export type CypressTestResultsSummary = { getAllResults(): Array<{ getTestResult
388
388
  getIsAborted(): boolean;
389
389
  setIsAborted(_isAborted: boolean): void;
390
390
  getAppUrls(): { getBatch(): string; setBatch(batch: string): void; getSession(): string; setSession(session: string): void; };
391
- setAppUrls(_appUrls: { readonly batch?: string; readonly session?: string; }): void;
391
+ setAppUrls(_appUrls: { readonly batch: string; readonly session: string; }): void;
392
392
  getApiUrls(): { getBatch(): string; setBatch(batch: string): void; getSession(): string; setSession(session: string): void; };
393
- setApiUrls(_apiUrls: { readonly batch?: string; readonly session?: string; }): void;
393
+ setApiUrls(_apiUrls: { readonly batch: string; readonly session: string; }): void;
394
394
  getStepsInfo(): Array<{
395
395
  getName(): string;
396
396
  setName(value: string): void;
@@ -401,7 +401,7 @@ export type CypressTestResultsSummary = { getAllResults(): Array<{ getTestResult
401
401
  getHasCurrentImage(): boolean;
402
402
  setHasCurrentImage(hasCurrentImage: boolean): void;
403
403
  getAppUrls(): { getStep(): string; setStep(step: string): void; getStepEditor(): string; setStepEditor(stepEditor: string): void; };
404
- setAppUrls(appUrls: { readonly step?: string; readonly stepEditor?: string; }): void;
404
+ setAppUrls(appUrls: { readonly step: string; readonly stepEditor: string; }): void;
405
405
  getApiUrls(): {
406
406
  getBaselineImage(): string;
407
407
  setBaselineImage(setBaselineImage: string): void;
@@ -415,29 +415,29 @@ export type CypressTestResultsSummary = { getAllResults(): Array<{ getTestResult
415
415
  setDiffImage(diffImage: string): void;
416
416
  };
417
417
  setApiUrls(apiUrls: {
418
- readonly baselineImage?: string;
419
- readonly currentImage?: string;
420
- readonly checkpointImage?: string;
421
- readonly checkpointImageThumbnail?: string;
422
- readonly diffImage?: string;
418
+ readonly baselineImage: string;
419
+ readonly currentImage: string;
420
+ readonly checkpointImage: string;
421
+ readonly checkpointImageThumbnail: string;
422
+ readonly diffImage: string;
423
423
  }): void;
424
424
  getRenderId(): Array<string>;
425
425
  setRenderId(renderId: Array<string>): void;
426
426
  }>;
427
427
  setStepsInfo(_stepInfo: Array<{
428
- readonly name?: string;
429
- readonly isDifferent?: boolean;
430
- readonly hasBaselineImage?: boolean;
431
- readonly hasCurrentImage?: boolean;
432
- readonly appUrls?: { readonly step?: string; readonly stepEditor?: string; };
433
- readonly apiUrls?: {
434
- readonly baselineImage?: string;
435
- readonly currentImage?: string;
436
- readonly checkpointImage?: string;
437
- readonly checkpointImageThumbnail?: string;
438
- readonly diffImage?: string;
428
+ readonly name: string;
429
+ readonly isDifferent: boolean;
430
+ readonly hasBaselineImage: boolean;
431
+ readonly hasCurrentImage: boolean;
432
+ readonly appUrls: { readonly step: string; readonly stepEditor: string; };
433
+ readonly apiUrls: {
434
+ readonly baselineImage: string;
435
+ readonly currentImage: string;
436
+ readonly checkpointImage: string;
437
+ readonly checkpointImageThumbnail: string;
438
+ readonly diffImage: string;
439
439
  };
440
- readonly renderId?: Array<string>;
440
+ readonly renderId: Array<string>;
441
441
  }>): void;
442
442
  getSteps(): number;
443
443
  setSteps(_steps: number): void;
@@ -498,9 +498,9 @@ export type CypressTestResultsSummary = { getAllResults(): Array<{ getTestResult
498
498
  getIsAborted(): boolean;
499
499
  setIsAborted(_isAborted: boolean): void;
500
500
  getAppUrls(): { getBatch(): string; setBatch(batch: string): void; getSession(): string; setSession(session: string): void; };
501
- setAppUrls(_appUrls: { readonly batch?: string; readonly session?: string; }): void;
501
+ setAppUrls(_appUrls: { readonly batch: string; readonly session: string; }): void;
502
502
  getApiUrls(): { getBatch(): string; setBatch(batch: string): void; getSession(): string; setSession(session: string): void; };
503
- setApiUrls(_apiUrls: { readonly batch?: string; readonly session?: string; }): void;
503
+ setApiUrls(_apiUrls: { readonly batch: string; readonly session: string; }): void;
504
504
  getStepsInfo(): Array<{
505
505
  getName(): string;
506
506
  setName(value: string): void;
@@ -511,7 +511,7 @@ export type CypressTestResultsSummary = { getAllResults(): Array<{ getTestResult
511
511
  getHasCurrentImage(): boolean;
512
512
  setHasCurrentImage(hasCurrentImage: boolean): void;
513
513
  getAppUrls(): { getStep(): string; setStep(step: string): void; getStepEditor(): string; setStepEditor(stepEditor: string): void; };
514
- setAppUrls(appUrls: { readonly step?: string; readonly stepEditor?: string; }): void;
514
+ setAppUrls(appUrls: { readonly step: string; readonly stepEditor: string; }): void;
515
515
  getApiUrls(): {
516
516
  getBaselineImage(): string;
517
517
  setBaselineImage(setBaselineImage: string): void;
@@ -525,29 +525,29 @@ export type CypressTestResultsSummary = { getAllResults(): Array<{ getTestResult
525
525
  setDiffImage(diffImage: string): void;
526
526
  };
527
527
  setApiUrls(apiUrls: {
528
- readonly baselineImage?: string;
529
- readonly currentImage?: string;
530
- readonly checkpointImage?: string;
531
- readonly checkpointImageThumbnail?: string;
532
- readonly diffImage?: string;
528
+ readonly baselineImage: string;
529
+ readonly currentImage: string;
530
+ readonly checkpointImage: string;
531
+ readonly checkpointImageThumbnail: string;
532
+ readonly diffImage: string;
533
533
  }): void;
534
534
  getRenderId(): Array<string>;
535
535
  setRenderId(renderId: Array<string>): void;
536
536
  }>;
537
537
  setStepsInfo(_stepInfo: Array<{
538
- readonly name?: string;
539
- readonly isDifferent?: boolean;
540
- readonly hasBaselineImage?: boolean;
541
- readonly hasCurrentImage?: boolean;
542
- readonly appUrls?: { readonly step?: string; readonly stepEditor?: string; };
543
- readonly apiUrls?: {
544
- readonly baselineImage?: string;
545
- readonly currentImage?: string;
546
- readonly checkpointImage?: string;
547
- readonly checkpointImageThumbnail?: string;
548
- readonly diffImage?: string;
538
+ readonly name: string;
539
+ readonly isDifferent: boolean;
540
+ readonly hasBaselineImage: boolean;
541
+ readonly hasCurrentImage: boolean;
542
+ readonly appUrls: { readonly step: string; readonly stepEditor: string; };
543
+ readonly apiUrls: {
544
+ readonly baselineImage: string;
545
+ readonly currentImage: string;
546
+ readonly checkpointImage: string;
547
+ readonly checkpointImageThumbnail: string;
548
+ readonly diffImage: string;
549
549
  };
550
- readonly renderId?: Array<string>;
550
+ readonly renderId: Array<string>;
551
551
  }>): void;
552
552
  getSteps(): number;
553
553
  setSteps(_steps: number): void;