@percy/sdk-utils 1.0.8 → 1.1.2

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,69 @@
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
- }
33
+ return stub;
34
+ } // matches ansi escape sequences
84
35
 
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
36
 
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');
115
-
116
- for (let stdio of ['stdout', 'stderr']) {
117
- Logger[stdio] = Object.assign(new Writable(), {
118
- columns: options.isTTY ? 100 : null,
119
- isTTY: options.isTTY,
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
120
38
 
121
- cursorTo() {},
39
+ function sanitizeLog(str) {
40
+ return str.replace(/\r\n/g, '\n').replace(ANSI_REG, '').replace(/\n$/, '');
41
+ }
122
42
 
123
- clearLine() {},
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();
52
+ },
124
53
 
125
- _write(chunk, encoding, callback) {
126
- helpers$1[stdio].push(sanitizeLog(chunk.toString(), options));
127
- callback();
128
- }
54
+ async teardown() {
55
+ if (process.env.__PERCY_BROWSERIFIED__) {
56
+ for (let m of ['warn', 'error', 'log']) {
57
+ var _console$m$restore, _console$m;
129
58
 
130
- });
59
+ (_console$m$restore = (_console$m = console[m]).restore) === null || _console$m$restore === void 0 ? void 0 : _console$m$restore.call(_console$m);
131
60
  }
132
- }
133
- },
134
-
135
- reset(soft) {
136
- if (soft) loglevel('info');else delete Logger.instance;
137
- helpers$1.stdout.length = 0;
138
- helpers$1.stderr.length = 0;
61
+ } else {
62
+ for (let io of ['stdout', 'stderr']) {
63
+ var _process$io$write$res, _process$io$write;
139
64
 
140
- if (console.log.reset) {
141
- console.log.reset();
142
- console.warn.reset();
143
- console.error.reset();
65
+ (_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);
66
+ }
144
67
  }
145
- },
146
-
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
- }
166
-
167
- };
168
68
 
169
- const helpers = {
170
- logger: helpers$1,
171
-
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();
69
+ return helpers.call('server.close');
180
70
  },
181
71
 
182
- teardown: () => helpers.call('server.close'),
183
72
  getRequests: () => helpers.call('server.requests'),
184
73
  testReply: (path, reply) => helpers.call('server.reply', path, reply),
185
74
  testFailure: function () {
186
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
187
- args[_key] = arguments[_key];
75
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
76
+ args[_key2] = arguments[_key2];
188
77
  }
189
78
 
190
79
  return helpers.call('server.test.failure', ...args);
@@ -194,13 +83,63 @@
194
83
  : helpers.call('server.test.serialize', fn),
195
84
  // set
196
85
  mockSite: () => helpers.call('site.mock'),
197
- closeSite: () => helpers.call('site.close')
86
+ closeSite: () => helpers.call('site.close'),
87
+ logger: {
88
+ stdout: [],
89
+ stderr: [],
90
+ loglevel: utils.logger.loglevel,
91
+
92
+ async mock() {
93
+ helpers.logger.reset();
94
+
95
+ let capture = err => msg => {
96
+ helpers.logger[err ? 'stderr' : 'stdout'].push(sanitizeLog(msg));
97
+ };
98
+
99
+ if (process.env.__PERCY_BROWSERIFIED__) {
100
+ // use console[warn|error|log] in browsers
101
+ for (let m of ['warn', 'error', 'log']) {
102
+ stub(console, m, capture(m !== 'log'));
103
+ }
104
+ } else {
105
+ // use process[stdout|stderr].write in node
106
+ for (let io of ['stdout', 'stderr']) {
107
+ stub(process[io], 'write', capture(io === 'stderr'));
108
+ }
109
+ }
110
+ },
111
+
112
+ reset() {
113
+ var _utils$logger$remote$;
114
+
115
+ (_utils$logger$remote$ = utils.logger.remote.socket) === null || _utils$logger$remote$ === void 0 ? void 0 : _utils$logger$remote$.close();
116
+ delete utils.logger.loglevel.lvl;
117
+ delete utils.logger.log.history;
118
+ helpers.logger.stdout.length = 0;
119
+ helpers.logger.stderr.length = 0;
120
+
121
+ if (process.env.__PERCY_BROWSERIFIED__) {
122
+ for (let m of ['warn', 'error', 'log']) {
123
+ var _console$m$reset, _console$m2;
124
+
125
+ (_console$m$reset = (_console$m2 = console[m]).reset) === null || _console$m$reset === void 0 ? void 0 : _console$m$reset.call(_console$m2);
126
+ }
127
+ } else {
128
+ for (let io of ['stdout', 'stderr']) {
129
+ var _process$io$write$res2, _process$io$write2;
130
+
131
+ (_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);
132
+ }
133
+ }
134
+ }
135
+
136
+ }
198
137
  };
199
138
 
200
139
  if (process.env.__PERCY_BROWSERIFIED__) {
201
140
  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];
141
+ for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
142
+ args[_key3 - 1] = arguments[_key3];
204
143
  }
205
144
 
206
145
  let {
@@ -264,15 +203,17 @@
264
203
  helpers.call = async function call() {
265
204
  let {
266
205
  context
267
- } = await import('./server.js');
206
+ } = await ({});
268
207
  helpers.context = helpers.context || (await context());
269
208
  return helpers.context.call(...arguments);
270
209
  };
271
210
  }
272
211
 
273
- return helpers;
212
+ var helpers_1 = helpers;
213
+
214
+ return helpers_1;
274
215
 
275
- })(PercySDKUtils.logger, PercySDKUtils);
216
+ })(PercySDKUtils);
276
217
  }).call(window);
277
218
 
278
219
  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,19 @@ 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
+ if (process.env.__PERCY_BROWSERIFIED__) {
45
+ for (let m of ['warn', 'error', 'log']) console[m].restore?.();
46
+ } else {
47
+ for (let io of ['stdout', 'stderr']) process[io].write.restore?.();
48
+ }
49
+
50
+ return helpers.call('server.close');
15
51
  },
16
52
 
17
- teardown: () => helpers.call('server.close'),
18
53
  getRequests: () => helpers.call('server.requests'),
19
54
  testReply: (path, reply) => helpers.call('server.reply', path, reply),
20
55
  testFailure: (...args) => helpers.call('server.test.failure', ...args),
@@ -23,7 +58,49 @@ export const helpers = {
23
58
  ? helpers.call('server.test.serialize') // get
24
59
  : helpers.call('server.test.serialize', fn), // set
25
60
  mockSite: () => helpers.call('site.mock'),
26
- closeSite: () => helpers.call('site.close')
61
+ closeSite: () => helpers.call('site.close'),
62
+
63
+ logger: {
64
+ stdout: [],
65
+ stderr: [],
66
+ loglevel: utils.logger.loglevel,
67
+
68
+ async mock() {
69
+ helpers.logger.reset();
70
+
71
+ let capture = err => msg => {
72
+ helpers.logger[err ? 'stderr' : 'stdout']
73
+ .push(sanitizeLog(msg));
74
+ };
75
+
76
+ if (process.env.__PERCY_BROWSERIFIED__) {
77
+ // use console[warn|error|log] in browsers
78
+ for (let m of ['warn', 'error', 'log']) {
79
+ stub(console, m, capture(m !== 'log'));
80
+ }
81
+ } else {
82
+ // use process[stdout|stderr].write in node
83
+ for (let io of ['stdout', 'stderr']) {
84
+ stub(process[io], 'write', capture(io === 'stderr'));
85
+ }
86
+ }
87
+ },
88
+
89
+ reset() {
90
+ utils.logger.remote.socket?.close();
91
+ delete utils.logger.loglevel.lvl;
92
+ delete utils.logger.log.history;
93
+
94
+ helpers.logger.stdout.length = 0;
95
+ helpers.logger.stderr.length = 0;
96
+
97
+ if (process.env.__PERCY_BROWSERIFIED__) {
98
+ for (let m of ['warn', 'error', 'log']) console[m].reset?.();
99
+ } else {
100
+ for (let io of ['stdout', 'stderr']) process[io].write.reset?.();
101
+ }
102
+ }
103
+ }
27
104
  };
28
105
 
29
106
  if (process.env.__PERCY_BROWSERIFIED__) {
@@ -77,4 +154,4 @@ if (process.env.__PERCY_BROWSERIFIED__) {
77
154
  };
78
155
  }
79
156
 
80
- export default helpers;
157
+ 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 };