@applitools/eyes-cypress 3.24.0-beta.5 → 3.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +2191 -2195
  2. package/LICENSE +25 -25
  3. package/README.md +803 -782
  4. package/bin/eyes-setup.js +21 -21
  5. package/commands.js +2 -2
  6. package/dist/browser/spec-driver.js +110 -106
  7. package/dist/plugin/handler.js +55 -55
  8. package/eyes-index.d.ts +34 -34
  9. package/index.js +2 -2
  10. package/package.json +98 -97
  11. package/src/browser/commands.js +188 -188
  12. package/src/browser/eyesCheckMapping.js +104 -103
  13. package/src/browser/eyesOpenMapping.js +60 -60
  14. package/src/browser/makeSend.js +18 -18
  15. package/src/browser/refer.js +57 -57
  16. package/src/browser/sendRequest.js +16 -16
  17. package/src/browser/socket.js +144 -143
  18. package/src/browser/socketCommands.js +81 -81
  19. package/src/browser/spec-driver.ts +117 -111
  20. package/src/pem/server.cert +22 -22
  21. package/src/pem/server.key +27 -27
  22. package/src/plugin/concurrencyMsg.js +8 -8
  23. package/src/plugin/config.js +54 -54
  24. package/src/plugin/defaultPort.js +1 -1
  25. package/src/plugin/errorDigest.js +96 -96
  26. package/src/plugin/getErrorsAndDiffs.js +34 -34
  27. package/src/plugin/handleTestResults.js +35 -39
  28. package/src/plugin/handler.ts +58 -58
  29. package/src/plugin/hooks.js +51 -50
  30. package/src/plugin/isGlobalHooksSupported.js +13 -13
  31. package/src/plugin/pluginExport.js +60 -60
  32. package/src/plugin/server.js +98 -98
  33. package/src/plugin/startPlugin.js +15 -13
  34. package/src/plugin/webSocket.js +130 -130
  35. package/src/setup/addEyesCommands.js +24 -24
  36. package/src/setup/addEyesCypressPlugin.js +15 -15
  37. package/src/setup/getCypressConfig.js +16 -16
  38. package/src/setup/getFilePath.js +22 -22
  39. package/src/setup/handleCommands.js +23 -23
  40. package/src/setup/handlePlugin.js +23 -23
  41. package/src/setup/handleTypeScript.js +21 -21
  42. package/src/setup/isCommandsDefined.js +7 -7
  43. package/src/setup/isPluginDefined.js +7 -7
  44. package/test/fixtures/testAppCopies/.gitignore +1 -1
@@ -1,143 +1,144 @@
1
- const uuid = require('uuid');
2
-
3
- class Socket {
4
- constructor() {
5
- this._socket = null;
6
- this._listeners = new Map();
7
- this._queue = new Set();
8
- }
9
-
10
- attach(ws) {
11
- if (!ws) return;
12
-
13
- if (ws.readyState === WebSocket.CONNECTING) ws.addEventListener('open', () => this.attach(ws));
14
- else if (ws.readyState === WebSocket.OPEN) {
15
- this._socket = ws;
16
- this._queue.forEach(command => command());
17
- this._queue.clear();
18
-
19
- this._socket.addEventListener('message', message => {
20
- const {name, key, payload} = this.deserialize(message);
21
- const fns = this._listeners.get(name);
22
- if (fns) fns.forEach(fn => fn(payload, key));
23
- if (key) {
24
- const fns = this._listeners.get(`${name}/${key}`);
25
- if (fns) fns.forEach(fn => fn(payload, key));
26
- }
27
- });
28
- this._socket.addEventListener('close', () => {
29
- const fns = this._listeners.get('close');
30
- if (fns) fns.forEach(fn => fn());
31
- });
32
- }
33
- }
34
-
35
- on(type, fn) {
36
- const name = typeof type === 'string' ? type : `${type.name}/${type.key}`;
37
- let fns = this._listeners.get(name);
38
- if (!fns) {
39
- fns = new Set();
40
- this._listeners.set(name, fns);
41
- }
42
- fns.add(fn);
43
- return () => this.off(name, fn);
44
- }
45
-
46
- connect(url) {
47
- const ws = new WebSocket(url);
48
- this.attach(ws);
49
- }
50
-
51
- disconnect() {
52
- if (!this._socket) return;
53
- this._socket.terminate();
54
- this._socket = null;
55
- }
56
-
57
- request(name, payload) {
58
- return new Promise((resolve, reject) => {
59
- try {
60
- const key = uuid.v4();
61
- this.emit({name, key}, payload);
62
- this.once({name, key}, response => {
63
- if (response.error) return reject(response.error);
64
- return resolve(response.result);
65
- });
66
- } catch (ex) {
67
- console.log(ex);
68
- throw ex;
69
- }
70
- });
71
- }
72
-
73
- command(name, fn) {
74
- this.on(name, async (payload, key) => {
75
- try {
76
- const result = await fn(payload);
77
- this.emit({name, key}, {result});
78
- } catch (error) {
79
- console.log(error);
80
- this.emit({name, key}, {error});
81
- }
82
- });
83
- }
84
-
85
- subscribe(name, publisher, fn) {
86
- const subscription = uuid.v4();
87
- this.emit(name, {publisher, subscription});
88
- const off = this.on({name, key: subscription}, fn);
89
- return () => (this.emit({name, key: subscription}), off());
90
- }
91
-
92
- once(type, fn) {
93
- const off = this.on(type, (...args) => (fn(...args), this.off()));
94
- return off;
95
- }
96
-
97
- off(name, fn) {
98
- if (!fn) return this._listeners.delete(name);
99
- const fns = this._listeners.get(name);
100
- if (!fns) return false;
101
- const existed = fns.delete(fn);
102
- if (!fns.size) this._listeners.delete(name);
103
- return existed;
104
- }
105
-
106
- emit(type, payload) {
107
- try {
108
- const command = () => this._socket.send(this.serialize(type, payload));
109
- if (this._socket) command();
110
- else this._queue.add(command);
111
- return () => this._queue.delete(command);
112
- } catch (ex) {
113
- console.log(ex);
114
- throw ex;
115
- }
116
- }
117
-
118
- ref() {
119
- const command = () => this._socket._socket.ref();
120
- if (this._socket) command();
121
- else this._queue.add(command);
122
- return () => this._queue.delete(command);
123
- }
124
-
125
- unref() {
126
- const command = () => this._socket._socket.unref();
127
- if (this._socket) command();
128
- else this._queue.add(command);
129
- return () => this._queue.delete(command);
130
- }
131
-
132
- serialize(type, payload) {
133
- const message =
134
- typeof type === 'string' ? {name: type, payload} : {name: type.name, key: type.key, payload};
135
- return JSON.stringify(message);
136
- }
137
-
138
- deserialize(message) {
139
- return JSON.parse(message.data);
140
- }
141
- }
142
-
143
- module.exports = Socket;
1
+ /* global WebSocket */
2
+ const uuid = require('uuid');
3
+
4
+ class Socket {
5
+ constructor() {
6
+ this._socket = null;
7
+ this._listeners = new Map();
8
+ this._queue = new Set();
9
+ }
10
+
11
+ attach(ws) {
12
+ if (!ws) return;
13
+
14
+ if (ws.readyState === WebSocket.CONNECTING) ws.addEventListener('open', () => this.attach(ws));
15
+ else if (ws.readyState === WebSocket.OPEN) {
16
+ this._socket = ws;
17
+ this._queue.forEach(command => command());
18
+ this._queue.clear();
19
+
20
+ this._socket.addEventListener('message', message => {
21
+ const {name, key, payload} = this.deserialize(message);
22
+ const fns = this._listeners.get(name);
23
+ if (fns) fns.forEach(fn => fn(payload, key));
24
+ if (key) {
25
+ const fns = this._listeners.get(`${name}/${key}`);
26
+ if (fns) fns.forEach(fn => fn(payload, key));
27
+ }
28
+ });
29
+ this._socket.addEventListener('close', () => {
30
+ const fns = this._listeners.get('close');
31
+ if (fns) fns.forEach(fn => fn());
32
+ });
33
+ }
34
+ }
35
+
36
+ on(type, fn) {
37
+ const name = typeof type === 'string' ? type : `${type.name}/${type.key}`;
38
+ let fns = this._listeners.get(name);
39
+ if (!fns) {
40
+ fns = new Set();
41
+ this._listeners.set(name, fns);
42
+ }
43
+ fns.add(fn);
44
+ return () => this.off(name, fn);
45
+ }
46
+
47
+ connect(url) {
48
+ const ws = new WebSocket(url);
49
+ this.attach(ws);
50
+ }
51
+
52
+ disconnect() {
53
+ if (!this._socket) return;
54
+ this._socket.terminate();
55
+ this._socket = null;
56
+ }
57
+
58
+ request(name, payload) {
59
+ return new Promise((resolve, reject) => {
60
+ try {
61
+ const key = uuid.v4();
62
+ this.emit({name, key}, payload);
63
+ this.once({name, key}, response => {
64
+ if (response.error) return reject(response.error);
65
+ return resolve(response.result);
66
+ });
67
+ } catch (ex) {
68
+ console.log(ex);
69
+ throw ex;
70
+ }
71
+ });
72
+ }
73
+
74
+ command(name, fn) {
75
+ this.on(name, async (payload, key) => {
76
+ try {
77
+ const result = await fn(payload);
78
+ this.emit({name, key}, {result});
79
+ } catch (error) {
80
+ console.log(error);
81
+ this.emit({name, key}, {error});
82
+ }
83
+ });
84
+ }
85
+
86
+ subscribe(name, publisher, fn) {
87
+ const subscription = uuid.v4();
88
+ this.emit(name, {publisher, subscription});
89
+ const off = this.on({name, key: subscription}, fn);
90
+ return () => (this.emit({name, key: subscription}), off());
91
+ }
92
+
93
+ once(type, fn) {
94
+ const off = this.on(type, (...args) => (fn(...args), this.off()));
95
+ return off;
96
+ }
97
+
98
+ off(name, fn) {
99
+ if (!fn) return this._listeners.delete(name);
100
+ const fns = this._listeners.get(name);
101
+ if (!fns) return false;
102
+ const existed = fns.delete(fn);
103
+ if (!fns.size) this._listeners.delete(name);
104
+ return existed;
105
+ }
106
+
107
+ emit(type, payload) {
108
+ try {
109
+ const command = () => this._socket.send(this.serialize(type, payload));
110
+ if (this._socket) command();
111
+ else this._queue.add(command);
112
+ return () => this._queue.delete(command);
113
+ } catch (ex) {
114
+ console.log(ex);
115
+ throw ex;
116
+ }
117
+ }
118
+
119
+ ref() {
120
+ const command = () => this._socket._socket.ref();
121
+ if (this._socket) command();
122
+ else this._queue.add(command);
123
+ return () => this._queue.delete(command);
124
+ }
125
+
126
+ unref() {
127
+ const command = () => this._socket._socket.unref();
128
+ if (this._socket) command();
129
+ else this._queue.add(command);
130
+ return () => this._queue.delete(command);
131
+ }
132
+
133
+ serialize(type, payload) {
134
+ const message =
135
+ typeof type === 'string' ? {name: type, payload} : {name: type.name, key: type.key, payload};
136
+ return JSON.stringify(message);
137
+ }
138
+
139
+ deserialize(message) {
140
+ return JSON.parse(message.data);
141
+ }
142
+ }
143
+
144
+ module.exports = Socket;
@@ -1,81 +1,81 @@
1
- const spec = require('../../dist/browser/spec-driver');
2
-
3
- function socketCommands(socket, refer) {
4
- socket.command('Driver.executeScript', ({context, script, arg = []}) => {
5
- const res = spec.executeScript(refer.deref(context), script, derefArgs(arg));
6
- return refer.ref(res);
7
- });
8
- socket.command('Driver.mainContext', () => {
9
- return refer.ref(spec.mainContext());
10
- });
11
-
12
- socket.command('Driver.parentContext', ({context}) => {
13
- return refer.ref(spec.parentContext(refer.deref(context)));
14
- });
15
-
16
- socket.command('Driver.childContext', ({context, element}) => {
17
- return refer.ref(spec.childContext(refer.deref(context), refer.deref(element)));
18
- });
19
-
20
- socket.command('Driver.getViewportSize', () => {
21
- return spec.getViewportSize();
22
- });
23
- socket.command('Driver.setViewportSize', vs => {
24
- spec.setViewportSize(vs);
25
- });
26
- socket.command('Driver.findElement', ({context, selector, parent}) => {
27
- const element = spec.findElement(
28
- refer.deref(context),
29
- spec.transformSelector(selector),
30
- refer.deref(parent),
31
- );
32
- return element === null ? element : refer.ref(element, context);
33
- });
34
- socket.command('Driver.findElements', ({context, selector, parent}) => {
35
- const elements = spec.findElements(
36
- refer.deref(context),
37
- spec.transformSelector(selector),
38
- refer.deref(parent),
39
- );
40
- return Array.prototype.map.call(elements, element =>
41
- element === null ? element : refer.ref(element, context),
42
- );
43
- });
44
-
45
- socket.command('Driver.getUrl', context => {
46
- return spec.getUrl(refer.deref(context));
47
- });
48
-
49
- socket.command('Driver.getTitle', context => {
50
- return spec.getTitle(refer.deref(context.driver));
51
- });
52
-
53
- socket.command('Driver.getCookies', async () => {
54
- return await spec.getCookies();
55
- });
56
-
57
- // utils
58
-
59
- function derefArgs(arg) {
60
- const derefArg = [];
61
- if (Array.isArray(arg)) {
62
- for (const argument of arg) {
63
- if (Array.isArray(argument)) {
64
- derefArg.push(derefArgs(argument));
65
- } else {
66
- derefArg.push(refer.deref(argument));
67
- }
68
- }
69
- return derefArg;
70
- } else if (typeof arg === 'object') {
71
- for (const [key, value] of Object.entries(arg)) {
72
- derefArg[key] = refer.deref(value);
73
- }
74
- return derefArg;
75
- } else {
76
- return arg;
77
- }
78
- }
79
- }
80
-
81
- module.exports = {socketCommands};
1
+ const spec = require('../../dist/browser/spec-driver');
2
+
3
+ function socketCommands(socket, refer) {
4
+ socket.command('Driver.executeScript', ({context, script, arg = []}) => {
5
+ const res = spec.executeScript(refer.deref(context), script, derefArgs(arg));
6
+ return refer.ref(res);
7
+ });
8
+ socket.command('Driver.mainContext', () => {
9
+ return refer.ref(spec.mainContext());
10
+ });
11
+
12
+ socket.command('Driver.parentContext', ({context}) => {
13
+ return refer.ref(spec.parentContext(refer.deref(context)));
14
+ });
15
+
16
+ socket.command('Driver.childContext', ({context, element}) => {
17
+ return refer.ref(spec.childContext(refer.deref(context), refer.deref(element)));
18
+ });
19
+
20
+ socket.command('Driver.getViewportSize', () => {
21
+ return spec.getViewportSize();
22
+ });
23
+ socket.command('Driver.setViewportSize', vs => {
24
+ spec.setViewportSize(vs);
25
+ });
26
+ socket.command('Driver.findElement', ({context, selector, parent}) => {
27
+ const element = spec.findElement(
28
+ refer.deref(context),
29
+ spec.transformSelector(selector),
30
+ refer.deref(parent),
31
+ );
32
+ return element === null ? element : refer.ref(element, context);
33
+ });
34
+ socket.command('Driver.findElements', ({context, selector, parent}) => {
35
+ const elements = spec.findElements(
36
+ refer.deref(context),
37
+ spec.transformSelector(selector),
38
+ refer.deref(parent),
39
+ );
40
+ return Array.prototype.map.call(elements, element =>
41
+ element === null ? element : refer.ref(element, context),
42
+ );
43
+ });
44
+
45
+ socket.command('Driver.getUrl', context => {
46
+ return spec.getUrl(refer.deref(context));
47
+ });
48
+
49
+ socket.command('Driver.getTitle', context => {
50
+ return spec.getTitle(refer.deref(context.driver));
51
+ });
52
+
53
+ socket.command('Driver.getCookies', async () => {
54
+ return await spec.getCookies();
55
+ });
56
+
57
+ // utils
58
+
59
+ function derefArgs(arg) {
60
+ const derefArg = [];
61
+ if (Array.isArray(arg)) {
62
+ for (const argument of arg) {
63
+ if (Array.isArray(argument)) {
64
+ derefArg.push(derefArgs(argument));
65
+ } else {
66
+ derefArg.push(refer.deref(argument));
67
+ }
68
+ }
69
+ return derefArg;
70
+ } else if (typeof arg === 'object') {
71
+ for (const [key, value] of Object.entries(arg)) {
72
+ derefArg[key] = refer.deref(value);
73
+ }
74
+ return derefArg;
75
+ } else {
76
+ return arg;
77
+ }
78
+ }
79
+ }
80
+
81
+ module.exports = {socketCommands};