@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/dist/bundle.js +123 -445
- package/dist/index.js +72 -10
- package/dist/logger.js +140 -0
- package/dist/percy-dom.js +22 -8
- package/dist/percy-enabled.js +33 -37
- package/dist/percy-idle.js +18 -4
- package/dist/percy-info.js +9 -1
- package/dist/post-snapshot.js +21 -7
- package/dist/request.js +21 -5
- package/package.json +3 -13
- package/test/client.js +95 -154
- package/test/helpers.js +85 -8
- package/test/server.js +13 -16
package/test/client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
(function() {
|
|
2
2
|
this["null"] = this["null"] || {};
|
|
3
|
-
this.PercySDKUtils.TestHelpers = (function (
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
25
|
+
stub.calls.push(args);
|
|
74
26
|
if (func) return func.apply(this, args);
|
|
75
27
|
}, {
|
|
76
|
-
restore: () => object[method] =
|
|
77
|
-
reset: () => (
|
|
28
|
+
restore: () => object[method] = stub.originalValue,
|
|
29
|
+
reset: () => (stub.calls.length = 0) || stub,
|
|
78
30
|
originalValue: object[method],
|
|
79
31
|
calls: []
|
|
80
32
|
});
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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
|
-
|
|
39
|
+
function sanitizeLog(str) {
|
|
40
|
+
return str.replace(/\r\n/g, '\n').replace(ANSI_REG, '').replace(/\n$/, '');
|
|
41
|
+
}
|
|
122
42
|
|
|
123
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
141
|
-
|
|
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
|
-
|
|
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
|
|
187
|
-
args[
|
|
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
|
|
203
|
-
args[
|
|
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
|
|
206
|
+
} = await ({});
|
|
268
207
|
helpers.context = helpers.context || (await context());
|
|
269
208
|
return helpers.context.call(...arguments);
|
|
270
209
|
};
|
|
271
210
|
}
|
|
272
211
|
|
|
273
|
-
|
|
212
|
+
var helpers_1 = helpers;
|
|
213
|
+
|
|
214
|
+
return helpers_1;
|
|
274
215
|
|
|
275
|
-
})(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
|
-
|
|
2
|
-
import utils from '@percy/sdk-utils';
|
|
1
|
+
const utils = require('@percy/sdk-utils');
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
157
|
+
module.exports = helpers;
|
package/test/server.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
191
|
-
const
|
|
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(
|
|
199
|
-
|
|
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
|
-
|
|
200
|
+
run(args.slice(1)).catch(console.error);
|
|
204
201
|
}
|
|
205
202
|
}
|
|
206
203
|
|
|
207
204
|
// export the namespace by default
|
|
208
|
-
|
|
205
|
+
module.exports = { context, start, stop, exec };
|