@percy/sdk-utils 1.1.0 → 1.1.3

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/test/client.js CHANGED
@@ -1,6 +1,6 @@
1
1
  (function() {
2
2
  this["null"] = this["null"] || {};
3
- this.PercySDKUtils.TestHelpers = (function (logger, utils) {
3
+ this.PercySDKUtils.TestHelpers = (function (require$$0) {
4
4
  'use strict';
5
5
 
6
6
  const process = (typeof globalThis !== "undefined" && globalThis.process) || {};
@@ -11,180 +11,73 @@
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
14
- var logger__default = /*#__PURE__*/_interopDefaultLegacy(logger);
15
- var utils__default = /*#__PURE__*/_interopDefaultLegacy(utils);
14
+ var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);
16
15
 
17
- const {
18
- assign,
19
- entries
20
- } = Object; // matches ansi escape sequences
16
+ const utils = require$$0__default["default"];
21
17
 
22
- const ANSI_REG = new RegExp('[\\u001B\\u009B][[\\]()#;?]*((?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)' + '|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', 'g'); // color names by ansi escape code
23
-
24
- const ANSI_COLORS = {
25
- '91m': 'red',
26
- '32m': 'green',
27
- '93m': 'yellow',
28
- '34m': 'blue',
29
- '95m': 'magenta',
30
- '90m': 'grey'
31
- }; // colorize each line of a string using an ansi escape sequence
32
-
33
- const LINE_REG = /^.*$/gm;
34
-
35
- function colorize(code, str) {
36
- return str.replace(LINE_REG, line => `\u001b[${code}${line}\u001b[39m`);
37
- } // map ansi colors to bound colorize functions
38
-
39
-
40
- entries(ANSI_COLORS).reduce((colors, _ref) => {
41
- let [code, name] = _ref;
42
- return assign(colors, {
43
- [name]: colorize.bind(null, code)
44
- });
45
- }, {});
46
-
47
- const ELAPSED_REG = /\s\S*?\(\d+ms\)\S*/;
48
- const NEWLINE_REG = /\r\n/g;
49
- const LASTLINE_REG = /\n$/;
50
-
51
- function sanitizeLog(str) {
52
- let {
53
- ansi,
54
- elapsed
55
- } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
56
- // normalize line endings
57
- str = str.replace(NEWLINE_REG, '\n'); // strip ansi colors
58
-
59
- if (!ansi) str = str.replace(ANSI_REG, ''); // strip elapsed time
60
-
61
- if (!elapsed) str = str.replace(ELAPSED_REG, ''); // strip trailing line endings
62
-
63
- return str.replace(LASTLINE_REG, '');
64
- }
65
-
66
- function spy(object, method, func) {
18
+ function stub(object, method, func) {
67
19
  if (object[method].restore) object[method].restore();
68
- let spy = Object.assign(function spy() {
20
+ let stub = object[method] = Object.assign(function stub() {
69
21
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
70
22
  args[_key] = arguments[_key];
71
23
  }
72
24
 
73
- spy.calls.push(args);
25
+ stub.calls.push(args);
74
26
  if (func) return func.apply(this, args);
75
27
  }, {
76
- restore: () => object[method] = spy.originalValue,
77
- reset: () => (spy.calls.length = 0) || spy,
28
+ restore: () => object[method] = stub.originalValue,
29
+ reset: () => (stub.calls.length = 0) || stub,
78
30
  originalValue: object[method],
79
31
  calls: []
80
32
  });
81
- object[method] = spy;
82
- return spy;
83
- }
84
-
85
- const {
86
- Logger,
87
- loglevel
88
- } = logger__default["default"];
89
- const helpers$1 = {
90
- stdout: [],
91
- stderr: [],
92
- loglevel,
93
-
94
- async mock() {
95
- let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
96
- helpers$1.reset();
97
-
98
- if (options.level) {
99
- loglevel(options.level);
100
- }
101
-
102
- if (process.env.__PERCY_BROWSERIFIED__) {
103
- spy(Logger.prototype, 'write', function (lvl, msg) {
104
- let stdio = lvl === 'info' ? 'stdout' : 'stderr';
105
- helpers$1[stdio].push(sanitizeLog(msg, options));
106
- return this.write.originalValue.call(this, lvl, msg);
107
- });
108
- spy(console, 'log');
109
- spy(console, 'warn');
110
- spy(console, 'error');
111
- } else {
112
- let {
113
- Writable
114
- } = await import('stream');
33
+ return stub;
34
+ } // matches ansi escape sequences
115
35
 
116
- for (let stdio of ['stdout', 'stderr']) {
117
- Logger[stdio] = Object.assign(new Writable(), {
118
- columns: options.isTTY ? 100 : null,
119
- isTTY: options.isTTY,
120
36
 
121
- cursorTo() {},
37
+ const ANSI_REG = new RegExp('[\\u001B\\u009B][[\\]()#;?]*((?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)' + '|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', 'g'); // strips a log message of excessive newlines and asni escape sequences
122
38
 
123
- clearLine() {},
124
-
125
- _write(chunk, encoding, callback) {
126
- helpers$1[stdio].push(sanitizeLog(chunk.toString(), options));
127
- callback();
128
- }
39
+ function sanitizeLog(str) {
40
+ return str.replace(/\r\n/g, '\n').replace(ANSI_REG, '').replace(/\n$/, '');
41
+ }
129
42
 
130
- });
131
- }
132
- }
43
+ const helpers = {
44
+ async setup() {
45
+ utils.percy.version = '';
46
+ delete utils.percy.config;
47
+ delete utils.percy.enabled;
48
+ delete utils.percy.domScript;
49
+ delete process.env.PERCY_SERVER_ADDRESS;
50
+ await helpers.call('server.mock');
51
+ await helpers.logger.mock();
133
52
  },
134
53
 
135
- reset(soft) {
136
- if (soft) loglevel('info');else delete Logger.instance;
137
- helpers$1.stdout.length = 0;
138
- helpers$1.stderr.length = 0;
54
+ async teardown() {
55
+ var _utils$logger$log$res, _utils$logger$log;
139
56
 
140
- if (console.log.reset) {
141
- console.log.reset();
142
- console.warn.reset();
143
- console.error.reset();
144
- }
145
- },
57
+ (_utils$logger$log$res = (_utils$logger$log = utils.logger.log).restore) === null || _utils$logger$log$res === void 0 ? void 0 : _utils$logger$log$res.call(_utils$logger$log);
146
58
 
147
- dump() {
148
- let msgs = Array.from(Logger.instance && Logger.instance.messages || []);
149
- if (!msgs.length) return;
150
-
151
- let log = m => process.env.__PERCY_BROWSERIFIED__ ? console.log.and ? console.log.and.originalFn(m) : console.log(m) : process.stderr.write(`${m}\n`);
152
-
153
- logger__default["default"].loglevel('debug');
154
- log(logger__default["default"].format('testing', 'warn', '--- DUMPING LOGS ---'));
155
- msgs.reduce((last, _ref) => {
156
- let {
157
- debug,
158
- level,
159
- message,
160
- timestamp
161
- } = _ref;
162
- log(logger__default["default"].format(debug, level, message, timestamp - last));
163
- return timestamp;
164
- }, msgs[0].timestamp);
165
- }
59
+ if (process.env.__PERCY_BROWSERIFIED__) {
60
+ for (let m of ['warn', 'error', 'log']) {
61
+ var _console$m$restore, _console$m;
166
62
 
167
- };
63
+ (_console$m$restore = (_console$m = console[m]).restore) === null || _console$m$restore === void 0 ? void 0 : _console$m$restore.call(_console$m);
64
+ }
65
+ } else {
66
+ for (let io of ['stdout', 'stderr']) {
67
+ var _process$io$write$res, _process$io$write;
168
68
 
169
- const helpers = {
170
- logger: helpers$1,
69
+ (_process$io$write$res = (_process$io$write = process[io].write).restore) === null || _process$io$write$res === void 0 ? void 0 : _process$io$write$res.call(_process$io$write);
70
+ }
71
+ }
171
72
 
172
- async setup() {
173
- utils__default["default"].percy.version = '';
174
- delete utils__default["default"].percy.config;
175
- delete utils__default["default"].percy.enabled;
176
- delete utils__default["default"].percy.domScript;
177
- delete process.env.PERCY_SERVER_ADDRESS;
178
- await helpers.call('server.mock');
179
- await helpers$1.mock();
73
+ return helpers.call('server.close');
180
74
  },
181
75
 
182
- teardown: () => helpers.call('server.close'),
183
76
  getRequests: () => helpers.call('server.requests'),
184
77
  testReply: (path, reply) => helpers.call('server.reply', path, reply),
185
78
  testFailure: function () {
186
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
187
- args[_key] = arguments[_key];
79
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
80
+ args[_key2] = arguments[_key2];
188
81
  }
189
82
 
190
83
  return helpers.call('server.test.failure', ...args);
@@ -194,13 +87,64 @@
194
87
  : helpers.call('server.test.serialize', fn),
195
88
  // set
196
89
  mockSite: () => helpers.call('site.mock'),
197
- closeSite: () => helpers.call('site.close')
90
+ closeSite: () => helpers.call('site.close'),
91
+ logger: {
92
+ stdout: [],
93
+ stderr: [],
94
+ loglevel: utils.logger.loglevel,
95
+
96
+ async mock() {
97
+ helpers.logger.reset();
98
+ let shouldCaptureLogs = false;
99
+ stub(utils.logger, 'log', function () {
100
+ shouldCaptureLogs = true;
101
+ utils.logger.log.originalValue(...arguments);
102
+ shouldCaptureLogs = false;
103
+ });
104
+
105
+ let stubLogs = (ctx, method, err) => stub(ctx, method, msg => {
106
+ if (!shouldCaptureLogs) return ctx[method].originalValue.call(ctx, msg);else helpers.logger[err ? 'stderr' : 'stdout'].push(sanitizeLog(msg));
107
+ });
108
+
109
+ if (process.env.__PERCY_BROWSERIFIED__) {
110
+ for (let m of ['warn', 'error', 'log']) stubLogs(console, m, m !== 'log');
111
+ } else {
112
+ for (let io of ['stdout', 'stderr']) stubLogs(process[io], 'write', io === 'stderr');
113
+ }
114
+ },
115
+
116
+ reset() {
117
+ var _utils$logger$remote$, _utils$logger$log$res2, _utils$logger$log2;
118
+
119
+ (_utils$logger$remote$ = utils.logger.remote.socket) === null || _utils$logger$remote$ === void 0 ? void 0 : _utils$logger$remote$.close();
120
+ delete utils.logger.loglevel.lvl;
121
+ delete utils.logger.log.history;
122
+ helpers.logger.stdout.length = 0;
123
+ helpers.logger.stderr.length = 0;
124
+ (_utils$logger$log$res2 = (_utils$logger$log2 = utils.logger.log).reset) === null || _utils$logger$log$res2 === void 0 ? void 0 : _utils$logger$log$res2.call(_utils$logger$log2);
125
+
126
+ if (process.env.__PERCY_BROWSERIFIED__) {
127
+ for (let m of ['warn', 'error', 'log']) {
128
+ var _console$m$reset, _console$m2;
129
+
130
+ (_console$m$reset = (_console$m2 = console[m]).reset) === null || _console$m$reset === void 0 ? void 0 : _console$m$reset.call(_console$m2);
131
+ }
132
+ } else {
133
+ for (let io of ['stdout', 'stderr']) {
134
+ var _process$io$write$res2, _process$io$write2;
135
+
136
+ (_process$io$write$res2 = (_process$io$write2 = process[io].write).reset) === null || _process$io$write$res2 === void 0 ? void 0 : _process$io$write$res2.call(_process$io$write2);
137
+ }
138
+ }
139
+ }
140
+
141
+ }
198
142
  };
199
143
 
200
144
  if (process.env.__PERCY_BROWSERIFIED__) {
201
145
  helpers.call = async function call(event) {
202
- for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
203
- args[_key2 - 1] = arguments[_key2];
146
+ for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
147
+ args[_key3 - 1] = arguments[_key3];
204
148
  }
205
149
 
206
150
  let {
@@ -264,15 +208,17 @@
264
208
  helpers.call = async function call() {
265
209
  let {
266
210
  context
267
- } = await import('./server.js');
211
+ } = await ({});
268
212
  helpers.context = helpers.context || (await context());
269
213
  return helpers.context.call(...arguments);
270
214
  };
271
215
  }
272
216
 
273
- return helpers;
217
+ var helpers_1 = helpers;
218
+
219
+ return helpers_1;
274
220
 
275
- })(PercySDKUtils.logger, PercySDKUtils);
221
+ })(PercySDKUtils);
276
222
  }).call(window);
277
223
 
278
224
  if (typeof define === "function" && define.amd) {
package/test/helpers.js CHANGED
@@ -1,9 +1,35 @@
1
- import logger from '@percy/logger/test/helpers';
2
- import utils from '@percy/sdk-utils';
1
+ const utils = require('@percy/sdk-utils');
3
2
 
4
- export const helpers = {
5
- logger,
3
+ function stub(object, method, func) {
4
+ if (object[method].restore) object[method].restore();
6
5
 
6
+ let stub = object[method] = Object.assign(function stub(...args) {
7
+ stub.calls.push(args);
8
+ if (func) return func.apply(this, args);
9
+ }, {
10
+ restore: () => (object[method] = stub.originalValue),
11
+ reset: () => (stub.calls.length = 0) || stub,
12
+ originalValue: object[method],
13
+ calls: []
14
+ });
15
+
16
+ return stub;
17
+ }
18
+
19
+ // matches ansi escape sequences
20
+ const ANSI_REG = new RegExp((
21
+ '[\\u001B\\u009B][[\\]()#;?]*((?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)' +
22
+ '|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
23
+ ), 'g');
24
+
25
+ // strips a log message of excessive newlines and asni escape sequences
26
+ function sanitizeLog(str) {
27
+ return str.replace(/\r\n/g, '\n')
28
+ .replace(ANSI_REG, '')
29
+ .replace(/\n$/, '');
30
+ }
31
+
32
+ const helpers = {
7
33
  async setup() {
8
34
  utils.percy.version = '';
9
35
  delete utils.percy.config;
@@ -11,10 +37,21 @@ export const helpers = {
11
37
  delete utils.percy.domScript;
12
38
  delete process.env.PERCY_SERVER_ADDRESS;
13
39
  await helpers.call('server.mock');
14
- await logger.mock();
40
+ await helpers.logger.mock();
41
+ },
42
+
43
+ async teardown() {
44
+ utils.logger.log.restore?.();
45
+
46
+ if (process.env.__PERCY_BROWSERIFIED__) {
47
+ for (let m of ['warn', 'error', 'log']) console[m].restore?.();
48
+ } else {
49
+ for (let io of ['stdout', 'stderr']) process[io].write.restore?.();
50
+ }
51
+
52
+ return helpers.call('server.close');
15
53
  },
16
54
 
17
- teardown: () => helpers.call('server.close'),
18
55
  getRequests: () => helpers.call('server.requests'),
19
56
  testReply: (path, reply) => helpers.call('server.reply', path, reply),
20
57
  testFailure: (...args) => helpers.call('server.test.failure', ...args),
@@ -23,7 +60,52 @@ export const helpers = {
23
60
  ? helpers.call('server.test.serialize') // get
24
61
  : helpers.call('server.test.serialize', fn), // set
25
62
  mockSite: () => helpers.call('site.mock'),
26
- closeSite: () => helpers.call('site.close')
63
+ closeSite: () => helpers.call('site.close'),
64
+
65
+ logger: {
66
+ stdout: [],
67
+ stderr: [],
68
+ loglevel: utils.logger.loglevel,
69
+
70
+ async mock() {
71
+ helpers.logger.reset();
72
+
73
+ let shouldCaptureLogs = false;
74
+
75
+ stub(utils.logger, 'log', (...args) => {
76
+ shouldCaptureLogs = true;
77
+ utils.logger.log.originalValue(...args);
78
+ shouldCaptureLogs = false;
79
+ });
80
+
81
+ let stubLogs = (ctx, method, err) => stub(ctx, method, msg => {
82
+ if (!shouldCaptureLogs) return ctx[method].originalValue.call(ctx, msg);
83
+ else helpers.logger[err ? 'stderr' : 'stdout'].push(sanitizeLog(msg));
84
+ });
85
+
86
+ if (process.env.__PERCY_BROWSERIFIED__) {
87
+ for (let m of ['warn', 'error', 'log']) stubLogs(console, m, m !== 'log');
88
+ } else {
89
+ for (let io of ['stdout', 'stderr']) stubLogs(process[io], 'write', io === 'stderr');
90
+ }
91
+ },
92
+
93
+ reset() {
94
+ utils.logger.remote.socket?.close();
95
+ delete utils.logger.loglevel.lvl;
96
+ delete utils.logger.log.history;
97
+
98
+ helpers.logger.stdout.length = 0;
99
+ helpers.logger.stderr.length = 0;
100
+ utils.logger.log.reset?.();
101
+
102
+ if (process.env.__PERCY_BROWSERIFIED__) {
103
+ for (let m of ['warn', 'error', 'log']) console[m].reset?.();
104
+ } else {
105
+ for (let io of ['stdout', 'stderr']) process[io].write.reset?.();
106
+ }
107
+ }
108
+ }
27
109
  };
28
110
 
29
111
  if (process.env.__PERCY_BROWSERIFIED__) {
@@ -77,4 +159,4 @@ if (process.env.__PERCY_BROWSERIFIED__) {
77
159
  };
78
160
  }
79
161
 
80
- export default helpers;
162
+ module.exports = helpers;
package/test/server.js CHANGED
@@ -1,9 +1,8 @@
1
- import fs from 'fs';
2
- import url from 'url';
3
- import path from 'path';
1
+ const fs = require('fs');
2
+ const path = require('path');
4
3
 
5
4
  // create a testing context for mocking the local percy server and a local testing site
6
- export async function context() {
5
+ async function context() {
7
6
  let { createTestServer } = await import('@percy/core/test/helpers/server');
8
7
 
9
8
  let ctx = {
@@ -65,7 +64,7 @@ export async function context() {
65
64
  return next();
66
65
  });
67
66
 
68
- ctx.server.websocket(ws => {
67
+ ctx.server.websocket('/(logger)?', ws => {
69
68
  if (!allowSocketConnections) return ws.terminate();
70
69
  ws.onmessage = ({ data }) => ctx.server.messages.push(data);
71
70
  });
@@ -109,7 +108,7 @@ export async function context() {
109
108
  }
110
109
 
111
110
  // start a testing server to control a context remotely
112
- export async function start(args) {
111
+ async function start(args) {
113
112
  let { logger } = await import('@percy/logger');
114
113
  let { WebSocketServer } = await import('ws');
115
114
  let log = logger('utils:test/server');
@@ -158,7 +157,7 @@ export async function start(args) {
158
157
  }
159
158
 
160
159
  // stop any existing testing server
161
- export async function stop() {
160
+ async function stop() {
162
161
  let { default: WS } = await import('ws');
163
162
 
164
163
  await new Promise(resolve => {
@@ -169,7 +168,7 @@ export async function stop() {
169
168
  }
170
169
 
171
170
  // start & stop a testing server around a command
172
- export async function exec(args) {
171
+ async function exec(args) {
173
172
  let argsep = args.indexOf('--');
174
173
  if (argsep < 0) throw new Error('Must supply a command after `--`');
175
174
 
@@ -187,22 +186,20 @@ export async function exec(args) {
187
186
  }
188
187
 
189
188
  // allow invoking start/stop/exec as CLI commands
190
- const filename = url.fileURLToPath(import.meta.url);
191
- const [program, ...args] = process.argv.slice(1);
192
-
193
- if (program === filename || `${program}.js` === filename) {
189
+ if (require.main === module) {
190
+ const args = process.argv.slice(2);
194
191
  const run = { start, stop, exec }[args[0]];
195
192
 
196
193
  if (!run) {
197
194
  process.stderr.write('usage: node test/server <start|stop|exec>\n');
198
- } else if (!process.send && fs.existsSync(path.join(filename, '../../src'))) {
199
- await import('child_process').then(cp => cp.fork(filename, args, {
195
+ } else if (!process.send && fs.existsSync(path.join(__filename, '../../src'))) {
196
+ import('child_process').then(cp => cp.fork(__filename, args, {
200
197
  execArgv: ['--no-warnings', '--loader=../../scripts/loader.js']
201
198
  }));
202
199
  } else {
203
- await run(args.slice(1)).catch(console.error);
200
+ run(args.slice(1)).catch(console.error);
204
201
  }
205
202
  }
206
203
 
207
204
  // export the namespace by default
208
- export * as default from './server.js';
205
+ module.exports = { context, start, stop, exec };