@testim/testim-cli 3.201.0 → 3.205.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.
@@ -54,6 +54,7 @@ class FeatureFlagsService {
54
54
  useSameBrowserForMultiTests: new LabFeatureFlag('labs'),
55
55
  highSpeedMode: new LabFeatureFlag(),
56
56
  usePortedHtml5DragDrop: new Rox.Flag(),
57
+ applitoolsNewIntegration: new Rox.Flag(),
57
58
  };
58
59
  Rox.register('default', this.flags);
59
60
  }
@@ -1,10 +1,30 @@
1
- "use strict";
1
+ 'use strict';
2
2
 
3
3
  const perf = require('./performance-logger');
4
4
 
5
5
  perf.log('getSessionPlayerRequire start');
6
6
  const getSessionPlayerFolder = require('./prepareRunnerAndTestimStartUtils').getSessionPlayerFolder;
7
+
7
8
  const testimAppDataFolder = getSessionPlayerFolder();
8
- const sessionPlayer = require(require('path').join(testimAppDataFolder, "sessionPlayer.js"));
9
+ /**
10
+ * @type {{
11
+ sessionPlayer: typeof import('../../../clickim/src/background/session/sessionPlayer').SessionPlayer;
12
+ utils: typeof import('../../../clickim/src/lib/utils').utils;
13
+ commonConstants: typeof import('../../../clickim/src/common/commonConstantsStrong');
14
+ locatorBuilderUtils: import('../../../clickim/src/locators/locatorBuilderUtils')['locatorBuilderUtils'];
15
+ assetService: import('../../../clickim/src/background/assetService')['assetService'];
16
+ localAssetService: import('../../../clickim/src/background/localAssetService');
17
+ urlUtils: import('../../../clickim/src/background/portMatch/urlUtils');
18
+ positionUtils: import('../../../clickim/src/lib/positionUtils');
19
+ visibilityUtils: import('../../../clickim/src/background/visibilityUtils');
20
+ apiCall: import('../../../clickim/src/common/playback/apiCall')['apiCall'];
21
+ stepParamBuilder: typeof import('../../../clickim/src/common/stepParamsBuilder').StepParamsBuilder;
22
+ stepParamExpressionEvaluator: import('../../../clickim/src/common/stepParamExpressionEvaluator');
23
+ manifestVersion: string | undefined;
24
+ EyeSdkBuilder: typeof import('../../../clickim/src/background/eyeSdkBuilder').EyeSdkBuilder
25
+ }}
26
+ */
27
+ const sessionPlayer = require(require('path').join(testimAppDataFolder, 'sessionPlayer.js')); // eslint-disable-line import/no-dynamic-require
28
+
9
29
  module.exports = sessionPlayer;
10
30
  perf.log('getSessionPlayerRequire end');
package/commons/logger.js CHANGED
@@ -1,7 +1,9 @@
1
1
  'use strict';
2
2
 
3
- const bunyan = require('bunyan');
3
+ const winston = require('winston');
4
+ const os = require('os');
4
5
 
6
+ const hostname = os.hostname();
5
7
  const runnerVersion = getRunnerVersion();
6
8
  const config = require('./config');
7
9
 
@@ -24,42 +26,45 @@ function getRunnerVersion() {
24
26
  }
25
27
 
26
28
  function getStreamsAndWaitForFlushPromise() {
27
- const level = config.LOGGER_DEBUG ? 'debug' : 'info';
28
- const streams = [];
29
+ const transports = [];
29
30
 
30
31
  let waitForFlush = () => Promise.resolve();
31
32
 
32
33
  if (!config.IS_ON_PREM) {
33
- const CoralogixBunyan = require('../lib/coralogix-bunyan.stream');
34
+ const { CoralogixTransport } = require('../lib/coralogix-winston.transport');
34
35
 
35
- waitForFlush = CoralogixBunyan.CoralogixStream.waitForFlush;
36
-
37
- CoralogixBunyan.CoralogixStream.configure(loggerConfig);
38
- streams.push({
39
- level,
40
- stream: new CoralogixBunyan.CoralogixStream({ category: 'ROOT' }),
41
- type: 'raw',
36
+ CoralogixTransport.configure(loggerConfig);
37
+ const loggerInstance = new CoralogixTransport({
38
+ category: 'ROOT',
42
39
  });
40
+ transports.push(loggerInstance);
41
+
42
+ waitForFlush = () => loggerInstance.waitForFlush();
43
43
  }
44
44
 
45
45
  if (config.LOGGER_CONSOLE) {
46
- const PrettyStream = require('bunyan-prettystream');
47
- const prettyStdOut = new PrettyStream();
48
- prettyStdOut.pipe(process.stdout);
49
- streams.push({
50
- level,
51
- stream: prettyStdOut,
52
- type: 'raw',
53
- });
46
+ transports.push(new winston.transports.Console({
47
+ format: winston.format.combine(winston.format.colorize(), winston.format.simple()),
48
+ }));
54
49
  }
55
- return [streams, waitForFlush];
50
+ return [transports, waitForFlush];
56
51
  }
57
52
 
58
- const [streams, waitForFlush] = getStreamsAndWaitForFlushPromise();
53
+ const [transports, waitForFlush] = getStreamsAndWaitForFlushPromise();
54
+ const level = config.LOGGER_DEBUG ? 'debug' : 'info';
55
+ const defaultMeta = {};
56
+ if (isLocal.indexOf('@echo') === -1) {
57
+ Object.assign(defaultMeta, devFlags());
59
58
 
60
- const bunyanMainLogger = bunyan.createLogger({
61
- name: 'runner',
62
- streams,
59
+ } else {
60
+ Object.assign(defaultMeta, localFlags());
61
+ }
62
+
63
+ const winstonMainLogger = winston.createLogger({
64
+ levels: winston.config.syslog.levels,
65
+ level,
66
+ transports,
67
+ defaultMeta: { name: 'runner', hostname, nodeVersion: process.version, runnerVersion, ...defaultMeta },
63
68
  });
64
69
 
65
70
  let executionId = null;
@@ -77,8 +82,8 @@ function setProxyUri(proxyUri) {
77
82
  if (config.IS_ON_PREM || !proxyUri) {
78
83
  return;
79
84
  }
80
- const CoralogixBunyan = require('../lib/coralogix-bunyan.stream');
81
- CoralogixBunyan.CoralogixStream.configure({ ...loggerConfig, proxyUri });
85
+ const { CoralogixTransport } = require('../lib/coralogix-winston.transport');
86
+ CoralogixTransport.configure({ ...loggerConfig, proxyUri });
82
87
  }
83
88
 
84
89
  function releaseFlags() {
@@ -102,53 +107,58 @@ function localFlags() {
102
107
  };
103
108
  }
104
109
 
105
- function addExecutionId(logData = {}) {
106
- if (executionId && !logData.executionId) {
110
+ function addExecutionMetadata(dataExecutionId) {
111
+ const logData = {};
112
+ if (executionId && !dataExecutionId) {
107
113
  logData.executionId = executionId;
108
114
  }
109
115
 
110
- logData.runnerVersion = runnerVersion;
111
116
  logData.projectId = projectId;
112
- logData.nodeVersion = process.version;
113
-
114
- if (isLocal.indexOf('@echo') === -1) {
115
- Object.assign(logData, devFlags());
116
-
117
+ logData.time = (new Date()).toISOString();
117
118
 
118
- return logData;
119
- }
120
-
121
- Object.assign(logData, localFlags());
122
119
  return logData;
123
120
  }
124
121
 
125
122
  class Logger {
126
123
  constructor(logger) {
127
124
  this._logger = logger;
128
- }
129
-
130
- trace(msg, data = {}) {
131
- this._logger.trace(addExecutionId(data), msg);
125
+ this.debug = this.debug.bind(this);
126
+ this.info = this.info.bind(this);
127
+ this.warn = this.warn.bind(this);
128
+ this.error = this.error.bind(this);
129
+ this.fatal = this.fatal.bind(this);
132
130
  }
133
131
 
134
132
  debug(msg, data = {}) {
135
- this._logger.debug(addExecutionId(data), msg);
133
+ this.innerLog('debug', msg, data);
136
134
  }
137
135
 
138
136
  info(msg, data = {}) {
139
- this._logger.info(addExecutionId(data), msg);
137
+ this.innerLog('info', msg, data);
140
138
  }
141
139
 
142
140
  warn(msg, data = {}) {
143
- this._logger.warn(addExecutionId(data), msg);
141
+ this.innerLog('warning', msg, data);
144
142
  }
145
143
 
146
144
  error(msg, data = {}) {
147
- this._logger.error(addExecutionId(data), msg);
145
+ this.innerLog('error', msg, data);
148
146
  }
149
147
 
150
148
  fatal(msg, data = {}) {
151
- this._logger.fatal(addExecutionId(data), msg);
149
+ this.innerLog('crit', msg, data);
150
+ }
151
+
152
+ innerLog(level, msg, data = {}) {
153
+ try {
154
+ this._logger.log(level, Object.assign({ meta: data }, { message: msg }, addExecutionMetadata(data.executionId)));
155
+ } catch (err) {
156
+ try {
157
+ this._logger.log('crit', Object.assign({ message: `failed to log message ${err.message}, ${err.stack}` }, addExecutionMetadata(data.executionId)));
158
+ } catch (err) {
159
+ // well what can we do
160
+ }
161
+ }
152
162
  }
153
163
 
154
164
  waitForFlush() {
@@ -157,7 +167,7 @@ class Logger {
157
167
  }
158
168
 
159
169
  function getLogger(loggerName) {
160
- return new Logger(bunyanMainLogger.child({ category: loggerName }));
170
+ return new Logger(winstonMainLogger.child({ category: loggerName }));
161
171
  }
162
172
 
163
173
  module.exports = {
@@ -428,6 +428,19 @@ function addTestRetry({
428
428
  }), DEFAULT_REQUEST_RETRY);
429
429
  }
430
430
 
431
+ /**
432
+ * @param {string} projectId
433
+ * @returns {Promise<import('../../../clickim/src/common/api/testimApplitoolsApi').ApplitoolsIntegrationData>}
434
+ */
435
+ function getApplitoolsIntegrationData(projectId) {
436
+ try {
437
+ return getWithAuth(`/integration/applitools/v3/connected?projectId=${projectId}`);
438
+ } catch (err) {
439
+ logger.warn('could\'nt get applitools integration data.', { err });
440
+ return {};
441
+ }
442
+ }
443
+
431
444
  module.exports = {
432
445
  getS3Artifact,
433
446
  getTestPlan,
@@ -459,4 +472,5 @@ module.exports = {
459
472
  getHybridGridProvider,
460
473
  loadTest,
461
474
  isTestResultCompleted,
475
+ getApplitoolsIntegrationData,
462
476
  };
@@ -0,0 +1,99 @@
1
+ const { Log, Severity, CoralogixLogger } = require('@testim/coralogix-logger');
2
+ const TransportStream = require('winston-transport');
3
+
4
+ const severityMap = {
5
+ silly: Severity.verbose,
6
+ verbose: Severity.verbose,
7
+ info: Severity.info,
8
+ http: Severity.info,
9
+ warn: Severity.warning,
10
+ warning: Severity.warning,
11
+ error: Severity.error,
12
+ silent: Severity.verbose,
13
+ critical: Severity.critical,
14
+ crit: Severity.critical,
15
+ debug: Severity.debug,
16
+ };
17
+
18
+ const errorProps = ['err', 'error', 'reason', 'e'];
19
+
20
+ class CoralogixTransport extends TransportStream {
21
+ constructor(options) {
22
+ options = Object.assign({}, CoralogixTransport.options, options);
23
+ super(options);
24
+ this.options = options;
25
+ this.logger = new CoralogixLogger(options.category);
26
+ this.name = 'Coralogix Transport';
27
+ if (options.timestamp) {
28
+ this.timestamp = options.timestamp;
29
+ }
30
+ }
31
+
32
+ log(info, callback) {
33
+ const { category, level, message: msg, meta: infoMeta = {}, ...restMeta } = info;
34
+ const meta = Object.assign({}, infoMeta, this.options.extraFields, restMeta);
35
+ const log = new Log();
36
+
37
+ log.severity = severityMap[level];
38
+ log.text = msg;
39
+ log.category = category;
40
+ if (meta.className) {
41
+ log.className = meta.className;
42
+ }
43
+ if (meta.methodName) {
44
+ log.methodName = meta.methodName;
45
+ }
46
+ if (meta.threadId) {
47
+ log.threadId = meta.threadId;
48
+ }
49
+ delete meta.className;
50
+ delete meta.methodName;
51
+ delete meta.threadId;
52
+ delete meta.category;
53
+ delete meta.level;
54
+ delete meta.message;
55
+ let errorOverride = false;
56
+ if (infoMeta instanceof Error) {
57
+ errorOverride = true;
58
+ meta.msg = infoMeta.message + infoMeta.stack;
59
+ if (msg) {
60
+ meta.msg = `${msg}\n${meta.msg}`;
61
+ }
62
+ }
63
+
64
+ for (const prop of errorProps) {
65
+ if (infoMeta[prop] instanceof Error) {
66
+ meta[prop] = {
67
+ message: infoMeta[prop].message,
68
+ stack: infoMeta[prop].stack,
69
+ name: infoMeta[prop].name,
70
+ type: infoMeta[prop].type,
71
+ cause: infoMeta[prop].cause,
72
+ ...infoMeta[prop],
73
+ };
74
+ }
75
+ }
76
+
77
+ // still have keys after deleting the above
78
+ if (Object.keys(meta).length > 0) {
79
+ if (msg && !errorOverride) {
80
+ meta.msg = msg;
81
+ }
82
+ log.text = meta;
83
+ }
84
+
85
+ this.logger.addLog(log);
86
+ callback(null, true);
87
+ }
88
+
89
+ waitForFlush() {
90
+ return this.logger.waitForFlush();
91
+ }
92
+
93
+ static configure(config) {
94
+ CoralogixLogger.configure(config);
95
+ CoralogixTransport.options = config;
96
+ }
97
+ }
98
+
99
+ module.exports.CoralogixTransport = CoralogixTransport;
@@ -165,9 +165,9 @@
165
165
  }
166
166
  },
167
167
  "ws": {
168
- "version": "7.5.5",
169
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
170
- "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w=="
168
+ "version": "7.5.6",
169
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
170
+ "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA=="
171
171
  }
172
172
  }
173
173
  },
@@ -607,6 +607,16 @@
607
607
  "to-fast-properties": "^2.0.0"
608
608
  }
609
609
  },
610
+ "@dabh/diagnostics": {
611
+ "version": "2.0.2",
612
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz",
613
+ "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==",
614
+ "requires": {
615
+ "colorspace": "1.1.x",
616
+ "enabled": "2.0.x",
617
+ "kuler": "^2.0.0"
618
+ }
619
+ },
610
620
  "@istanbuljs/load-nyc-config": {
611
621
  "version": "1.1.0",
612
622
  "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -1550,9 +1560,9 @@
1550
1560
  }
1551
1561
  },
1552
1562
  "ws": {
1553
- "version": "7.5.5",
1554
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
1555
- "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w=="
1563
+ "version": "7.5.6",
1564
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
1565
+ "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA=="
1556
1566
  }
1557
1567
  }
1558
1568
  },
@@ -2297,22 +2307,6 @@
2297
2307
  "integrity": "sha1-HEF554ak9Sl6XT6LxQlazp2RjDU=",
2298
2308
  "dev": true
2299
2309
  },
2300
- "bunyan": {
2301
- "version": "1.8.15",
2302
- "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz",
2303
- "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==",
2304
- "requires": {
2305
- "dtrace-provider": "~0.8",
2306
- "moment": "^2.19.3",
2307
- "mv": "~2",
2308
- "safe-json-stringify": "~1"
2309
- }
2310
- },
2311
- "bunyan-prettystream": {
2312
- "version": "0.1.3",
2313
- "resolved": "https://registry.npmjs.org/bunyan-prettystream/-/bunyan-prettystream-0.1.3.tgz",
2314
- "integrity": "sha1-bDtxMmb2rTIAfHtqsemYokU0nZg="
2315
- },
2316
2310
  "bytes": {
2317
2311
  "version": "3.1.0",
2318
2312
  "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
@@ -2386,9 +2380,9 @@
2386
2380
  "dev": true
2387
2381
  },
2388
2382
  "caniuse-lite": {
2389
- "version": "1.0.30001282",
2390
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001282.tgz",
2391
- "integrity": "sha512-YhF/hG6nqBEllymSIjLtR2iWDDnChvhnVJqp+vloyt2tEHFG1yBR+ac2B/rOw0qOK0m0lEXU2dv4E/sMk5P9Kg==",
2383
+ "version": "1.0.30001283",
2384
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz",
2385
+ "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==",
2392
2386
  "dev": true
2393
2387
  },
2394
2388
  "caseless": {
@@ -2538,9 +2532,9 @@
2538
2532
  }
2539
2533
  },
2540
2534
  "ws": {
2541
- "version": "7.5.5",
2542
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
2543
- "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w=="
2535
+ "version": "7.5.6",
2536
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
2537
+ "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA=="
2544
2538
  }
2545
2539
  }
2546
2540
  },
@@ -2558,9 +2552,9 @@
2558
2552
  },
2559
2553
  "dependencies": {
2560
2554
  "@types/node": {
2561
- "version": "16.11.9",
2562
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz",
2563
- "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A=="
2555
+ "version": "16.11.10",
2556
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz",
2557
+ "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA=="
2564
2558
  },
2565
2559
  "mkdirp": {
2566
2560
  "version": "0.5.5",
@@ -2569,14 +2563,6 @@
2569
2563
  "requires": {
2570
2564
  "minimist": "^1.2.5"
2571
2565
  }
2572
- },
2573
- "rimraf": {
2574
- "version": "3.0.2",
2575
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
2576
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
2577
- "requires": {
2578
- "glob": "^7.1.3"
2579
- }
2580
2566
  }
2581
2567
  }
2582
2568
  },
@@ -2734,6 +2720,30 @@
2734
2720
  "object-visit": "^1.0.0"
2735
2721
  }
2736
2722
  },
2723
+ "color": {
2724
+ "version": "3.2.1",
2725
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
2726
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
2727
+ "requires": {
2728
+ "color-convert": "^1.9.3",
2729
+ "color-string": "^1.6.0"
2730
+ },
2731
+ "dependencies": {
2732
+ "color-convert": {
2733
+ "version": "1.9.3",
2734
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
2735
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
2736
+ "requires": {
2737
+ "color-name": "1.1.3"
2738
+ }
2739
+ },
2740
+ "color-name": {
2741
+ "version": "1.1.3",
2742
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
2743
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
2744
+ }
2745
+ }
2746
+ },
2737
2747
  "color-convert": {
2738
2748
  "version": "2.0.1",
2739
2749
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -2747,12 +2757,35 @@
2747
2757
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2748
2758
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2749
2759
  },
2760
+ "color-string": {
2761
+ "version": "1.7.4",
2762
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.7.4.tgz",
2763
+ "integrity": "sha512-nVdUvPVgZMpRQad5dcsCMOSB5BXLljklTiaxS6ehhKxDsAI5sD7k5VmFuBt1y3Rlym8uulc/ANUN/bMWtBu6Sg==",
2764
+ "requires": {
2765
+ "color-name": "^1.0.0",
2766
+ "simple-swizzle": "^0.2.2"
2767
+ }
2768
+ },
2750
2769
  "color-support": {
2751
2770
  "version": "1.1.3",
2752
2771
  "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
2753
2772
  "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
2754
2773
  "dev": true
2755
2774
  },
2775
+ "colors": {
2776
+ "version": "1.4.0",
2777
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
2778
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
2779
+ },
2780
+ "colorspace": {
2781
+ "version": "1.1.4",
2782
+ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
2783
+ "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
2784
+ "requires": {
2785
+ "color": "^3.1.3",
2786
+ "text-hex": "1.0.x"
2787
+ }
2788
+ },
2756
2789
  "combine-source-map": {
2757
2790
  "version": "0.8.0",
2758
2791
  "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
@@ -3445,15 +3478,6 @@
3445
3478
  }
3446
3479
  }
3447
3480
  },
3448
- "dtrace-provider": {
3449
- "version": "0.8.8",
3450
- "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz",
3451
- "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==",
3452
- "optional": true,
3453
- "requires": {
3454
- "nan": "^2.14.0"
3455
- }
3456
- },
3457
3481
  "duplexify": {
3458
3482
  "version": "3.7.1",
3459
3483
  "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
@@ -3530,9 +3554,9 @@
3530
3554
  "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ=="
3531
3555
  },
3532
3556
  "electron-to-chromium": {
3533
- "version": "1.3.904",
3534
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.904.tgz",
3535
- "integrity": "sha512-x5uZWXcVNYkTh4JubD7KSC1VMKz0vZwJUqVwY3ihsW0bst1BXDe494Uqbg3Y0fDGVjJqA8vEeGuvO5foyH2+qw==",
3557
+ "version": "1.4.4",
3558
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.4.tgz",
3559
+ "integrity": "sha512-teHtgwcmVcL46jlFvAaqjyiTLWuMrUQO1JqV303JKB4ysXG6m8fXSFhbjal9st0r9mNskI22AraJZorb1VcLVg==",
3536
3560
  "dev": true
3537
3561
  },
3538
3562
  "emoji-regex": {
@@ -3541,6 +3565,11 @@
3541
3565
  "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
3542
3566
  "dev": true
3543
3567
  },
3568
+ "enabled": {
3569
+ "version": "2.0.0",
3570
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
3571
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
3572
+ },
3544
3573
  "encodeurl": {
3545
3574
  "version": "1.0.2",
3546
3575
  "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@@ -4095,6 +4124,11 @@
4095
4124
  "pend": "~1.2.0"
4096
4125
  }
4097
4126
  },
4127
+ "fecha": {
4128
+ "version": "4.2.1",
4129
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz",
4130
+ "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q=="
4131
+ },
4098
4132
  "figures": {
4099
4133
  "version": "2.0.0",
4100
4134
  "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
@@ -4351,6 +4385,11 @@
4351
4385
  "readable-stream": "^2.3.6"
4352
4386
  }
4353
4387
  },
4388
+ "fn.name": {
4389
+ "version": "1.1.0",
4390
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
4391
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
4392
+ },
4354
4393
  "follow-redirects": {
4355
4394
  "version": "1.14.5",
4356
4395
  "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
@@ -5780,15 +5819,6 @@
5780
5819
  "semver": "^6.0.0"
5781
5820
  }
5782
5821
  },
5783
- "rimraf": {
5784
- "version": "3.0.2",
5785
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
5786
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
5787
- "dev": true,
5788
- "requires": {
5789
- "glob": "^7.1.3"
5790
- }
5791
- },
5792
5822
  "semver": {
5793
5823
  "version": "6.3.0",
5794
5824
  "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -6068,9 +6098,9 @@
6068
6098
  }
6069
6099
  },
6070
6100
  "ws": {
6071
- "version": "7.5.5",
6072
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
6073
- "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w=="
6101
+ "version": "7.5.6",
6102
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
6103
+ "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA=="
6074
6104
  }
6075
6105
  }
6076
6106
  },
@@ -6200,6 +6230,11 @@
6200
6230
  "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
6201
6231
  "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
6202
6232
  },
6233
+ "kuler": {
6234
+ "version": "2.0.0",
6235
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
6236
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
6237
+ },
6203
6238
  "last-run": {
6204
6239
  "version": "1.1.1",
6205
6240
  "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
@@ -6484,6 +6519,18 @@
6484
6519
  }
6485
6520
  }
6486
6521
  },
6522
+ "logform": {
6523
+ "version": "2.3.0",
6524
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz",
6525
+ "integrity": "sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ==",
6526
+ "requires": {
6527
+ "colors": "^1.2.1",
6528
+ "fecha": "^4.2.0",
6529
+ "ms": "^2.1.1",
6530
+ "safe-stable-stringify": "^1.1.0",
6531
+ "triple-beam": "^1.3.0"
6532
+ }
6533
+ },
6487
6534
  "lru-cache": {
6488
6535
  "version": "4.1.5",
6489
6536
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
@@ -7180,32 +7227,11 @@
7180
7227
  "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
7181
7228
  "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
7182
7229
  },
7183
- "mv": {
7184
- "version": "2.1.1",
7185
- "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz",
7186
- "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=",
7187
- "optional": true,
7188
- "requires": {
7189
- "mkdirp": "~0.5.1",
7190
- "ncp": "~2.0.0",
7191
- "rimraf": "~2.4.0"
7192
- },
7193
- "dependencies": {
7194
- "mkdirp": {
7195
- "version": "0.5.5",
7196
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
7197
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
7198
- "optional": true,
7199
- "requires": {
7200
- "minimist": "^1.2.5"
7201
- }
7202
- }
7203
- }
7204
- },
7205
7230
  "nan": {
7206
7231
  "version": "2.15.0",
7207
7232
  "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
7208
7233
  "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
7234
+ "dev": true,
7209
7235
  "optional": true
7210
7236
  },
7211
7237
  "nanomatch": {
@@ -7232,12 +7258,6 @@
7232
7258
  "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
7233
7259
  "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE="
7234
7260
  },
7235
- "ncp": {
7236
- "version": "2.0.0",
7237
- "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
7238
- "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
7239
- "optional": true
7240
- },
7241
7261
  "negotiator": {
7242
7262
  "version": "0.6.2",
7243
7263
  "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
@@ -10691,15 +10711,6 @@
10691
10711
  "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
10692
10712
  "dev": true
10693
10713
  },
10694
- "rimraf": {
10695
- "version": "3.0.2",
10696
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
10697
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
10698
- "dev": true,
10699
- "requires": {
10700
- "glob": "^7.1.3"
10701
- }
10702
- },
10703
10714
  "safe-buffer": {
10704
10715
  "version": "5.1.2",
10705
10716
  "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -10948,6 +10959,14 @@
10948
10959
  "wrappy": "1"
10949
10960
  }
10950
10961
  },
10962
+ "one-time": {
10963
+ "version": "1.0.0",
10964
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
10965
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
10966
+ "requires": {
10967
+ "fn.name": "1.x.x"
10968
+ }
10969
+ },
10951
10970
  "onetime": {
10952
10971
  "version": "2.0.1",
10953
10972
  "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
@@ -12101,27 +12120,11 @@
12101
12120
  "integrity": "sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ=="
12102
12121
  },
12103
12122
  "rimraf": {
12104
- "version": "2.4.5",
12105
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
12106
- "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=",
12107
- "optional": true,
12123
+ "version": "3.0.2",
12124
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
12125
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
12108
12126
  "requires": {
12109
- "glob": "^6.0.1"
12110
- },
12111
- "dependencies": {
12112
- "glob": {
12113
- "version": "6.0.4",
12114
- "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
12115
- "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
12116
- "optional": true,
12117
- "requires": {
12118
- "inflight": "^1.0.4",
12119
- "inherits": "2",
12120
- "minimatch": "2 || 3",
12121
- "once": "^1.3.0",
12122
- "path-is-absolute": "^1.0.0"
12123
- }
12124
- }
12127
+ "glob": "^7.1.3"
12125
12128
  }
12126
12129
  },
12127
12130
  "rox-node": {
@@ -12160,12 +12163,6 @@
12160
12163
  "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
12161
12164
  "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
12162
12165
  },
12163
- "safe-json-stringify": {
12164
- "version": "1.2.0",
12165
- "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz",
12166
- "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==",
12167
- "optional": true
12168
- },
12169
12166
  "safe-regex": {
12170
12167
  "version": "1.1.0",
12171
12168
  "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
@@ -12175,6 +12172,11 @@
12175
12172
  "ret": "~0.1.10"
12176
12173
  }
12177
12174
  },
12175
+ "safe-stable-stringify": {
12176
+ "version": "1.1.1",
12177
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz",
12178
+ "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw=="
12179
+ },
12178
12180
  "safer-buffer": {
12179
12181
  "version": "2.1.2",
12180
12182
  "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -12356,6 +12358,21 @@
12356
12358
  "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
12357
12359
  "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ=="
12358
12360
  },
12361
+ "simple-swizzle": {
12362
+ "version": "0.2.2",
12363
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
12364
+ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
12365
+ "requires": {
12366
+ "is-arrayish": "^0.3.1"
12367
+ },
12368
+ "dependencies": {
12369
+ "is-arrayish": {
12370
+ "version": "0.3.2",
12371
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
12372
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
12373
+ }
12374
+ }
12375
+ },
12359
12376
  "sinon": {
12360
12377
  "version": "9.0.2",
12361
12378
  "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz",
@@ -12677,15 +12694,6 @@
12677
12694
  "semver": "^6.0.0"
12678
12695
  }
12679
12696
  },
12680
- "rimraf": {
12681
- "version": "3.0.2",
12682
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
12683
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
12684
- "dev": true,
12685
- "requires": {
12686
- "glob": "^7.1.3"
12687
- }
12688
- },
12689
12697
  "semver": {
12690
12698
  "version": "6.3.0",
12691
12699
  "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -12941,9 +12949,9 @@
12941
12949
  },
12942
12950
  "dependencies": {
12943
12951
  "debug": {
12944
- "version": "4.3.2",
12945
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
12946
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
12952
+ "version": "4.3.3",
12953
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
12954
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
12947
12955
  "requires": {
12948
12956
  "ms": "2.1.2"
12949
12957
  }
@@ -13061,6 +13069,11 @@
13061
13069
  "minimatch": "^3.0.4"
13062
13070
  }
13063
13071
  },
13072
+ "text-hex": {
13073
+ "version": "1.0.0",
13074
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
13075
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
13076
+ },
13064
13077
  "threads": {
13065
13078
  "version": "0.12.0",
13066
13079
  "resolved": "https://registry.npmjs.org/threads/-/threads-0.12.0.tgz",
@@ -13221,6 +13234,11 @@
13221
13234
  "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
13222
13235
  "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
13223
13236
  },
13237
+ "triple-beam": {
13238
+ "version": "1.3.0",
13239
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
13240
+ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
13241
+ },
13224
13242
  "ts-node": {
13225
13243
  "version": "8.10.1",
13226
13244
  "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.1.tgz",
@@ -13796,6 +13814,53 @@
13796
13814
  "string-width": "^1.0.2 || 2 || 3 || 4"
13797
13815
  }
13798
13816
  },
13817
+ "winston": {
13818
+ "version": "3.3.3",
13819
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz",
13820
+ "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==",
13821
+ "requires": {
13822
+ "@dabh/diagnostics": "^2.0.2",
13823
+ "async": "^3.1.0",
13824
+ "is-stream": "^2.0.0",
13825
+ "logform": "^2.2.0",
13826
+ "one-time": "^1.0.0",
13827
+ "readable-stream": "^3.4.0",
13828
+ "stack-trace": "0.0.x",
13829
+ "triple-beam": "^1.3.0",
13830
+ "winston-transport": "^4.4.0"
13831
+ },
13832
+ "dependencies": {
13833
+ "async": {
13834
+ "version": "3.2.2",
13835
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
13836
+ "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g=="
13837
+ },
13838
+ "is-stream": {
13839
+ "version": "2.0.1",
13840
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
13841
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
13842
+ },
13843
+ "readable-stream": {
13844
+ "version": "3.6.0",
13845
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
13846
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
13847
+ "requires": {
13848
+ "inherits": "^2.0.3",
13849
+ "string_decoder": "^1.1.1",
13850
+ "util-deprecate": "^1.0.1"
13851
+ }
13852
+ }
13853
+ }
13854
+ },
13855
+ "winston-transport": {
13856
+ "version": "4.4.0",
13857
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz",
13858
+ "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==",
13859
+ "requires": {
13860
+ "readable-stream": "^2.3.7",
13861
+ "triple-beam": "^1.2.0"
13862
+ }
13863
+ },
13799
13864
  "word-wrap": {
13800
13865
  "version": "1.2.3",
13801
13866
  "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testim/testim-cli",
3
- "version": "3.201.0",
3
+ "version": "3.205.0",
4
4
  "description": "Command line interface for running Testing on your CI",
5
5
  "author": "Oren Rubin",
6
6
  "contributors": [{
@@ -60,8 +60,8 @@
60
60
  "bluebird": "3.7.2",
61
61
  "bluebird-retry": "0.11.0",
62
62
  "body-parser": "1.19.0",
63
- "bunyan": "1.8.15",
64
- "bunyan-prettystream": "0.1.3",
63
+ "winston": "3.3.3",
64
+ "winston-transport": "4.4.0",
65
65
  "chalk": "4.1.0",
66
66
  "chrome-launcher": "0.13.4",
67
67
  "combine-source-map": "0.8.0",
@@ -9,19 +9,22 @@ class PixelValidationStepAction extends StepAction {
9
9
  async performAction() {
10
10
  const { shouldUseVisualGrid, applitoolsSdkConfig: config, testResultId } = this.context;
11
11
  this.runContext = this.context.getRunContext(undefined);
12
- const eyeManager = await eyeSdkService.getManager(shouldUseVisualGrid, this.context.config.applitoolsConcurrency || 5, testResultId);
12
+ const batchId = (config.batch && config.batch.id) || testResultId;
13
+ const eyeManager = await eyeSdkService.getManager(shouldUseVisualGrid, this.context.config.applitoolsConcurrency || 5, batchId, this.runContext.applitoolsIntegrationData);
13
14
  const targetElementData = this.getTarget() || {};
15
+ let result;
14
16
  try {
15
17
  const openedEye = await eyeManager.openEyes({ driver: this.driver.client, config });
16
18
  const region = (this.step.action === 'element' && targetElementData.seleniumElement) || undefined;
17
19
  await openedEye.check({ settings: { region, fully: this.step.action === 'stitched' } });
18
20
  const eyesResults = await openedEye.close();
19
21
 
20
- return { isApplitoolsSdkResult: true, success: true, eyesResults };
22
+ result = { isApplitoolsSdkResult: true, success: true, eyesResults };
21
23
  } catch (err) {
22
24
  logger.error('Applitools SDK step failed', { err, info: err.info });
23
- return { isApplitoolsSdkResult: true, success: false, err };
25
+ result = { isApplitoolsSdkResult: true, success: false, err };
24
26
  }
27
+ return await eyeSdkService.handleApplitoolsSdkResult(this.context, result);
25
28
  }
26
29
  }
27
30
 
@@ -1,9 +1,10 @@
1
- // https://github.com/applitools/eyes.sdk.javascript1/blob/master/packages/eyes-webdriverio-4/src/spec-driver.ts
2
-
3
1
  /**
4
- * @type {{ EyeSdkBuilder: typeof import('../../../../clickim/src/background/eyeSdkBuilder').EyeSdkBuilder }}
2
+ * @typedef {typeof import('../../../../clickim/src/background/eyeSdkBuilder').EyeSdkBuilder} EyeSdkBuilder
3
+ * @typedef {import('@applitools/types').SpecDriver} SpecDriver
4
+ * @typedef {import('@applitools/types').Core} Core
5
5
  */
6
- const sessionPlayer = require('../../commons/getSessionPlayerRequire');
6
+
7
+ const { EyeSdkBuilder } = require('../../commons/getSessionPlayerRequire');
7
8
  const { makeSDK } = require('@applitools/eyes-sdk-core');
8
9
  const { W3C_ELEMENT_ID } = require('../constants');
9
10
  const _ = require('lodash');
@@ -31,7 +32,8 @@ function getValueOrFallbackIfNullOrUndefined(value, fallback) {
31
32
  }
32
33
 
33
34
  /**
34
- * @typedef {import('@applitools/types').SpecDriver} SpecDriver
35
+ * Applitools Spec Driver for webdriverIO 4.
36
+ * @see https://github.com/applitools/eyes.sdk.javascript1/blob/master/packages/eyes-webdriverio-4/src/spec-driver.ts
35
37
  * @implements {SpecDriver}
36
38
  */
37
39
  class EyesSpec {
@@ -215,20 +217,19 @@ class EyesSpec {
215
217
 
216
218
  class EyeSdkService {
217
219
  constructor() {
218
- /**
219
- * @typedef {import('@applitools/types').Core} Core
220
- * @type {Core}
221
- */
220
+ /** @type {Core} */
222
221
  this.sdk = makeSDK({
223
222
  name: 'Testim.io',
224
223
  version: '4.0.0',
225
224
  spec: new EyesSpec(),
226
225
  VisualGridClient: require('@applitools/visual-grid-client'),
227
226
  });
227
+ /** @type {EyeSdkBuilder['handleApplitoolsSdkResult']} */
228
+ this.handleApplitoolsSdkResult = EyeSdkBuilder.handleApplitoolsSdkResult;
228
229
  }
229
- async getManager(useVisualGrid, concurrency, batchId) {
230
+ async getManager(useVisualGrid, concurrency, batchId, applitoolsIntegrationData) {
230
231
  const manager = await this.sdk.makeManager({ type: useVisualGrid ? 'vg' : 'classic', concurrency });
231
- sessionPlayer.EyeSdkBuilder.rememberCreatedBatch(batchId);
232
+ EyeSdkBuilder.rememberCreatedBatch(batchId, applitoolsIntegrationData);
232
233
  return manager;
233
234
  }
234
235
  }
@@ -19,6 +19,7 @@ const { getSuite, calcTestResultStatus, validateConfig } = require('./runnerUtil
19
19
  const { StopRunOnError, ArgError } = require('../errors');
20
20
  const Logger = require('../commons/logger');
21
21
  const perf = require('../commons/performance-logger');
22
+ const featureFlags = require('../commons/featureFlags');
22
23
 
23
24
  const guid = utils.guid;
24
25
  const logger = Logger.getLogger('test-plan-runner');
@@ -75,6 +76,34 @@ class TestPlanRunner {
75
76
  return catchBeforeTestsFailed(executionId);
76
77
  }
77
78
  throw err;
79
+ })
80
+ .finally(async () => {
81
+ if ((tpOptions.lightweightMode && tpOptions.lightweightMode.disablePixelValidation) || !featureFlags.flags.applitoolsNewIntegration.isEnabled()) {
82
+ return;
83
+ }
84
+ // When sessionPlayer is available, use it - as it only attempts to close batches that exist.
85
+ if (tpOptions.mode === constants.CLI_MODE.SELENIUM) {
86
+ const { EyeSdkBuilder } = require('../commons/getSessionPlayerRequire');
87
+ await EyeSdkBuilder.closeBatch(executionId);
88
+ return;
89
+ }
90
+ try {
91
+ if (!tpOptions.company || !tpOptions.company.activePlan || !tpOptions.company.activePlan.premiumFeatures || !tpOptions.company.activePlan.premiumFeatures.applitools) {
92
+ return;
93
+ }
94
+ const applitoolsIntegrationData = await testimServicesApi.getApplitoolsIntegrationData(tpOptions.project);
95
+ if (_.isEmpty(applitoolsIntegrationData)) {
96
+ return;
97
+ }
98
+ const { runKey: apiKey, url: serverUrl } = applitoolsIntegrationData;
99
+ const tmpSDK = require('@applitools/eyes-sdk-core').makeSDK({ name: 'Testim.io', version: '4.0.0', spec: {} });
100
+ await tmpSDK.closeBatches({ batchIds: [executionId], serverUrl, apiKey });
101
+ } catch (err) {
102
+ if (err.message && err.message.startsWith('Request failed with status code 404')) { // If a batch with this name did not exist, do not log an error.
103
+ return;
104
+ }
105
+ logger.error('Failed closing batch in extension mode', { err, projectId: tpOptions.project });
106
+ }
78
107
  });
79
108
  }
80
109
 
@@ -50,13 +50,12 @@ function getSerializableObject(grid) {
50
50
  (tunnel && grid.hybrid.external && grid.hybrid.external[grid.hybrid.tunnel] && grid.hybrid.external[grid.hybrid.tunnel].user) : user;
51
51
  const tunnelKey = type === gridTypes.HYBRID ?
52
52
  (tunnel && grid.hybrid.external && grid.hybrid.external[grid.hybrid.tunnel] && grid.hybrid.external[grid.hybrid.tunnel].key) : key;
53
- const arn = (grid && grid.external && grid.external.arn) || (tunnel && grid.hybrid.external && grid.hybrid.external[grid.hybrid.tunnel] && grid.hybrid.external[grid.hybrid.tunnel].arn);
54
53
  const name = grid && grid.name;
55
54
  const gridId = grid && (grid._id || grid.gridId);
56
55
  const provider = grid && grid.provider;
57
56
 
58
57
  return {
59
- host, port, path, protocol, accessToken, slotId, gridId, tunnel, user, key, type, name, arn, provider, tunnelUser, tunnelKey,
58
+ host, port, path, protocol, accessToken, slotId, gridId, tunnel, user, key, type, name, provider, tunnelUser, tunnelKey,
60
59
  };
61
60
  }
62
61
 
package/testRunHandler.js CHANGED
@@ -237,6 +237,12 @@ TestRun.prototype.clearTestResult = function () {
237
237
  if (this._options.mockNetworkRules) {
238
238
  runData.mockNetworkRules = this._options.mockNetworkRules;
239
239
  }
240
+ const mustClearPreviousStepResults = !this.isAllowReportTestResultRetries() && (this._timeoutRetryCount > 1 || this._retryCount > 1);
241
+
242
+ if (this._options.lightweightMode && this._options.lightweightMode.disableResults &&
243
+ !mustClearPreviousStepResults) {
244
+ return Promise.resolve();
245
+ }
240
246
 
241
247
  this.clearTestResultFinished = testimServicesApi.uploadRunDataArtifact(this._options.project, this._testId, this._testResultId, runData)
242
248
  .catch(err => {
@@ -90,9 +90,7 @@ class BaseWorker {
90
90
  resultId: testRunHandler.getTestResultId(),
91
91
  seleniumSession: player.getSessionId(),
92
92
  });
93
- if (this.options.lightweightMode && this.options.lightweightMode.disableResults) {
94
- return undefined;
95
- }
93
+
96
94
  return await testRunHandler.clearTestResult();
97
95
  }
98
96
 
@@ -1,56 +0,0 @@
1
- 'use strict';
2
-
3
- // This is copied from coralogix-bunyan-stream pacakge and altered to expose waitForFlush
4
-
5
- const coralogixLogger = require('@testim/coralogix-logger');
6
-
7
- const sevMap = {
8
- 10: coralogixLogger.Severity.debug,
9
- 30: coralogixLogger.Severity.info,
10
- 40: coralogixLogger.Severity.warning,
11
- 50: coralogixLogger.Severity.error,
12
- 60: coralogixLogger.Severity.critical,
13
- 20: coralogixLogger.Severity.debug,
14
- };
15
- const CoralogixStream = (function () {
16
- function CoralogixStream(options) {
17
- if (!options) options = {};
18
- CoralogixStream.logger = this.logger = new coralogixLogger.CoralogixLogger(options.category);
19
- }
20
- CoralogixStream.waitForFlush = function () {
21
- return CoralogixStream.logger.waitForFlush();
22
- };
23
- CoralogixStream.prototype.write = function (rec) {
24
- const log = new coralogixLogger.Log();
25
- log.severity = sevMap[rec.level];
26
- log.category = rec.category;
27
- if (rec.className) log.className = rec.className;
28
- if (rec.methodName) log.methodName = rec.methodName;
29
- if (rec.threadId) log.threadId = rec.threadId;
30
- log.text = this.removeStaticFields(rec);
31
- this.logger.addLog(log);
32
- };
33
- CoralogixStream.prototype.removeStaticFields = function (json) {
34
- delete json.threadId;
35
- delete json.methodName;
36
- delete json.className;
37
- delete json.category;
38
- return JSON.stringify(json, this.replaceErrors);
39
- };
40
- CoralogixStream.prototype.replaceErrors = function (key, value) {
41
- if (value instanceof Error) {
42
- const error = {};
43
- Object.getOwnPropertyNames(value).forEach((key) => {
44
- error[key] = value[key];
45
- });
46
- return error;
47
- }
48
- return value;
49
- };
50
- CoralogixStream.configure = function (config) {
51
- coralogixLogger.CoralogixLogger.configure(config);
52
- };
53
- return CoralogixStream;
54
- }());
55
-
56
- module.exports = { CoralogixStream };