@percy/core 1.28.8-beta.4 → 1.28.8
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/config.js +9 -0
- package/dist/percy.js +13 -3
- package/dist/queue.js +27 -22
- package/dist/server.js +21 -18
- package/dist/snapshot.js +2 -1
- package/package.json +10 -10
package/dist/config.js
CHANGED
|
@@ -9,6 +9,9 @@ export const configSchema = {
|
|
|
9
9
|
},
|
|
10
10
|
token: {
|
|
11
11
|
type: 'string'
|
|
12
|
+
},
|
|
13
|
+
labels: {
|
|
14
|
+
type: 'string'
|
|
12
15
|
}
|
|
13
16
|
}
|
|
14
17
|
},
|
|
@@ -74,6 +77,9 @@ export const configSchema = {
|
|
|
74
77
|
testCase: {
|
|
75
78
|
type: 'string'
|
|
76
79
|
},
|
|
80
|
+
labels: {
|
|
81
|
+
type: 'string'
|
|
82
|
+
},
|
|
77
83
|
thTestCaseExecutionId: {
|
|
78
84
|
type: 'string'
|
|
79
85
|
},
|
|
@@ -328,6 +334,9 @@ export const snapshotSchema = {
|
|
|
328
334
|
testCase: {
|
|
329
335
|
$ref: '/config/snapshot#/properties/testCase'
|
|
330
336
|
},
|
|
337
|
+
labels: {
|
|
338
|
+
$ref: '/config/snapshot#/properties/labels'
|
|
339
|
+
},
|
|
331
340
|
thTestCaseExecutionId: {
|
|
332
341
|
$ref: '/config/snapshot#/properties/thTestCaseExecutionId'
|
|
333
342
|
},
|
package/dist/percy.js
CHANGED
|
@@ -38,6 +38,7 @@ export class Percy {
|
|
|
38
38
|
// implies `skipUploads` and `skipDiscovery`
|
|
39
39
|
dryRun,
|
|
40
40
|
// implies `dryRun`, silent logs, and adds extra api endpoints
|
|
41
|
+
labels,
|
|
41
42
|
testing,
|
|
42
43
|
// configuration filepath
|
|
43
44
|
config: configFile,
|
|
@@ -53,12 +54,13 @@ export class Percy {
|
|
|
53
54
|
// options which will become accessible via the `.config` property
|
|
54
55
|
...options
|
|
55
56
|
} = {}) {
|
|
56
|
-
var _config$percy;
|
|
57
|
+
var _config$percy, _config$percy2;
|
|
57
58
|
let config = PercyConfig.load({
|
|
58
59
|
overrides: options,
|
|
59
60
|
path: configFile
|
|
60
61
|
});
|
|
61
|
-
|
|
62
|
+
labels ?? (labels = (_config$percy = config.percy) === null || _config$percy === void 0 ? void 0 : _config$percy.labels);
|
|
63
|
+
deferUploads ?? (deferUploads = (_config$percy2 = config.percy) === null || _config$percy2 === void 0 ? void 0 : _config$percy2.deferUploads);
|
|
62
64
|
this.config = config;
|
|
63
65
|
if (testing) loglevel = 'silent';
|
|
64
66
|
if (loglevel) this.loglevel(loglevel);
|
|
@@ -69,11 +71,13 @@ export class Percy {
|
|
|
69
71
|
this.skipDiscovery = this.dryRun || !!skipDiscovery;
|
|
70
72
|
this.delayUploads = this.skipUploads || !!delayUploads;
|
|
71
73
|
this.deferUploads = this.skipUploads || !!deferUploads;
|
|
74
|
+
this.labels = labels;
|
|
72
75
|
this.client = new PercyClient({
|
|
73
76
|
token,
|
|
74
77
|
clientInfo,
|
|
75
78
|
environmentInfo,
|
|
76
|
-
config
|
|
79
|
+
config,
|
|
80
|
+
labels
|
|
77
81
|
});
|
|
78
82
|
if (server) this.server = createPercyServer(this, port);
|
|
79
83
|
this.browser = new Browser(this);
|
|
@@ -358,6 +362,12 @@ export class Percy {
|
|
|
358
362
|
}
|
|
359
363
|
|
|
360
364
|
// validate comparison uploads and warn about any errors
|
|
365
|
+
|
|
366
|
+
// we are having two similar attrs in options: tags & tag
|
|
367
|
+
// tags: is used as labels and is string comma-separated like "tag1,tag"
|
|
368
|
+
// tag: is comparison-tag used by app-percy & poa and this is used to create a comparison-tag in BE
|
|
369
|
+
// its format is object like {name: "", os:"", os_version:"", device:""}
|
|
370
|
+
// DO NOT GET CONFUSED!!! :)
|
|
361
371
|
if ('tag' in options || 'tiles' in options) {
|
|
362
372
|
var _options$tag;
|
|
363
373
|
// throw when missing required snapshot or tag name
|
package/dist/queue.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
function _classPrivateMethodInitSpec(
|
|
2
|
-
function _classPrivateFieldInitSpec(
|
|
3
|
-
function _checkPrivateRedeclaration(
|
|
4
|
-
function _defineProperty(
|
|
5
|
-
function
|
|
6
|
-
function
|
|
7
|
-
function
|
|
8
|
-
function
|
|
9
|
-
function
|
|
10
|
-
function
|
|
1
|
+
function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
|
|
2
|
+
function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
|
|
3
|
+
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
|
|
4
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
+
function _classPrivateFieldSet(e, t, r) { var s = _classPrivateFieldGet2(t, e); return _classApplyDescriptorSet(e, s, r), r; }
|
|
8
|
+
function _classApplyDescriptorSet(e, t, l) { if (t.set) t.set.call(e, l);else { if (!t.writable) throw new TypeError("attempted to set read only private field"); t.value = l; } }
|
|
9
|
+
function _classPrivateMethodGet(s, a, r) { return _assertClassBrand(a, s), r; }
|
|
10
|
+
function _classPrivateFieldGet(e, t) { var r = _classPrivateFieldGet2(t, e); return _classApplyDescriptorGet(e, r); }
|
|
11
|
+
function _classPrivateFieldGet2(s, a) { return s.get(_assertClassBrand(s, a)); }
|
|
12
|
+
function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
|
|
13
|
+
function _classApplyDescriptorGet(e, t) { return t.get ? t.get.call(e) : t.value; }
|
|
11
14
|
import { yieldFor, generatePromise, AbortController } from './utils.js';
|
|
12
15
|
import logger from '@percy/logger';
|
|
13
16
|
|
|
@@ -160,24 +163,26 @@ export class Queue {
|
|
|
160
163
|
|
|
161
164
|
// Returns an item task matching the provided subject.
|
|
162
165
|
|
|
166
|
+
// keep track of start and end tasks
|
|
167
|
+
|
|
163
168
|
// Initialize a starting task or return an existing one.
|
|
164
169
|
start() {
|
|
165
|
-
var
|
|
170
|
+
var _classPrivateFieldGet3;
|
|
166
171
|
_classPrivateFieldGet(this, _start) ?? _classPrivateFieldSet(this, _start, deferred({
|
|
167
172
|
readyState: 1
|
|
168
173
|
}));
|
|
169
|
-
(
|
|
174
|
+
(_classPrivateFieldGet3 = _classPrivateFieldGet(this, _start)).handler ?? (_classPrivateFieldGet3.handler = _classPrivateFieldGet(this, _end) // wait for any ending task to complete first
|
|
170
175
|
? () => _classPrivateFieldGet(this, _end).promise.then(_classPrivateFieldGet(this, _handlers).start) : _classPrivateFieldGet(this, _handlers).start);
|
|
171
176
|
return _classPrivateMethodGet(this, _process, _process2).call(this, _classPrivateFieldGet(this, _start)).deferred;
|
|
172
177
|
}
|
|
173
178
|
|
|
174
179
|
// intialize an ending task or return an existing one
|
|
175
180
|
end() {
|
|
176
|
-
var
|
|
181
|
+
var _classPrivateFieldGet4;
|
|
177
182
|
_classPrivateFieldGet(this, _end) ?? _classPrivateFieldSet(this, _end, deferred({
|
|
178
183
|
readyState: 0
|
|
179
184
|
}));
|
|
180
|
-
(
|
|
185
|
+
(_classPrivateFieldGet4 = _classPrivateFieldGet(this, _end)).handler ?? (_classPrivateFieldGet4.handler = _classPrivateFieldGet(this, _start) // wait for any starting task to complete first
|
|
181
186
|
? () => _classPrivateFieldGet(this, _start).promise.then(_classPrivateFieldGet(this, _handlers).end) : _classPrivateFieldGet(this, _handlers).end);
|
|
182
187
|
return _classPrivateMethodGet(this, _process, _process2).call(this, _classPrivateFieldGet(this, _end)).deferred;
|
|
183
188
|
}
|
|
@@ -202,9 +207,9 @@ export class Queue {
|
|
|
202
207
|
|
|
203
208
|
// close a running queue, optionally aborting it
|
|
204
209
|
close(abort) {
|
|
205
|
-
var
|
|
210
|
+
var _classPrivateFieldGet5;
|
|
206
211
|
// when starting, state is updated afterwards
|
|
207
|
-
if ((
|
|
212
|
+
if ((_classPrivateFieldGet5 = _classPrivateFieldGet(this, _start)) !== null && _classPrivateFieldGet5 !== void 0 && _classPrivateFieldGet5.pending) _classPrivateFieldGet(this, _start).readyState = 3;
|
|
208
213
|
if (this.readyState < 3) this.readyState = 3;
|
|
209
214
|
if (abort) this.clear();
|
|
210
215
|
return this;
|
|
@@ -223,10 +228,10 @@ export class Queue {
|
|
|
223
228
|
|
|
224
229
|
// process a single item task when started
|
|
225
230
|
process(item) {
|
|
226
|
-
var
|
|
231
|
+
var _classPrivateFieldGet6;
|
|
227
232
|
let task = _classPrivateMethodGet(this, _find, _find2).call(this, item);
|
|
228
233
|
if (task && !_classPrivateFieldGet(this, _start)) this.start();
|
|
229
|
-
(
|
|
234
|
+
(_classPrivateFieldGet6 = _classPrivateFieldGet(this, _start)) === null || _classPrivateFieldGet6 === void 0 ? void 0 : _classPrivateFieldGet6.promise.then(() => _classPrivateMethodGet(this, _process, _process2).call(this, task));
|
|
230
235
|
return task === null || task === void 0 ? void 0 : task.deferred;
|
|
231
236
|
}
|
|
232
237
|
|
|
@@ -236,9 +241,9 @@ export class Queue {
|
|
|
236
241
|
// callback every 10ms during checks with the current number of pending tasks
|
|
237
242
|
idle(callback) {
|
|
238
243
|
return yieldFor(() => {
|
|
239
|
-
var
|
|
244
|
+
var _classPrivateFieldGet7;
|
|
240
245
|
callback === null || callback === void 0 ? void 0 : callback(_classPrivateFieldGet(this, _pending).size);
|
|
241
|
-
let starting = ((
|
|
246
|
+
let starting = ((_classPrivateFieldGet7 = _classPrivateFieldGet(this, _start)) === null || _classPrivateFieldGet7 === void 0 ? void 0 : _classPrivateFieldGet7.pending) === true;
|
|
242
247
|
return !starting && !_classPrivateFieldGet(this, _pending).size;
|
|
243
248
|
}, {
|
|
244
249
|
idle: 10
|
|
@@ -324,8 +329,8 @@ function _process2(task) {
|
|
|
324
329
|
async function* _until2(task, callback) {
|
|
325
330
|
try {
|
|
326
331
|
yield* yieldFor(() => {
|
|
327
|
-
var
|
|
328
|
-
if ((
|
|
332
|
+
var _classPrivateFieldGet8;
|
|
333
|
+
if ((_classPrivateFieldGet8 = _classPrivateFieldGet(this, _start)) !== null && _classPrivateFieldGet8 !== void 0 && _classPrivateFieldGet8.pending) return false;
|
|
329
334
|
let queued,
|
|
330
335
|
pending = _classPrivateFieldGet(this, _pending).size;
|
|
331
336
|
// calculate the position within queued when not pending
|
package/dist/server.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
function _classPrivateMethodInitSpec(
|
|
2
|
-
function _classPrivateFieldInitSpec(
|
|
3
|
-
function _checkPrivateRedeclaration(
|
|
4
|
-
function
|
|
5
|
-
function _classApplyDescriptorGet(
|
|
6
|
-
function _classPrivateMethodGet(
|
|
7
|
-
function _classPrivateFieldSet(
|
|
8
|
-
function
|
|
9
|
-
function
|
|
1
|
+
function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
|
|
2
|
+
function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
|
|
3
|
+
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
|
|
4
|
+
function _classPrivateFieldGet2(e, t) { var r = _classPrivateFieldGet(t, e); return _classApplyDescriptorGet(e, r); }
|
|
5
|
+
function _classApplyDescriptorGet(e, t) { return t.get ? t.get.call(e) : t.value; }
|
|
6
|
+
function _classPrivateMethodGet(s, a, r) { return _assertClassBrand(a, s), r; }
|
|
7
|
+
function _classPrivateFieldSet(e, t, r) { var s = _classPrivateFieldGet(t, e); return _classApplyDescriptorSet(e, s, r), r; }
|
|
8
|
+
function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
|
|
9
|
+
function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
|
|
10
|
+
function _classApplyDescriptorSet(e, t, l) { if (t.set) t.set.call(e, l);else { if (!t.writable) throw new TypeError("attempted to set read only private field"); t.value = l; } }
|
|
10
11
|
import fs from 'fs';
|
|
11
12
|
import path from 'path';
|
|
12
13
|
import http from 'http';
|
|
@@ -130,7 +131,7 @@ export class Server extends http.Server {
|
|
|
130
131
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
131
132
|
if (req.method === 'OPTIONS') {
|
|
132
133
|
let allowHeaders = req.headers['access-control-request-headers'] || '*';
|
|
133
|
-
let allowMethods = [...new Set(
|
|
134
|
+
let allowMethods = [...new Set(_classPrivateFieldGet2(this, _routes).flatMap(route => (!route.match || route.match(req.url.pathname)) && route.methods || []))].join(', ');
|
|
134
135
|
res.setHeader('Access-Control-Allow-Headers', allowHeaders);
|
|
135
136
|
res.setHeader('Access-Control-Allow-Methods', allowMethods);
|
|
136
137
|
res.writeHead(204).end();
|
|
@@ -152,8 +153,8 @@ export class Server extends http.Server {
|
|
|
152
153
|
});
|
|
153
154
|
// track open connections to terminate when the server closes
|
|
154
155
|
this.on('connection', socket => {
|
|
155
|
-
let handleClose = () =>
|
|
156
|
-
|
|
156
|
+
let handleClose = () => _classPrivateFieldGet2(this, _sockets).delete(socket);
|
|
157
|
+
_classPrivateFieldGet2(this, _sockets).add(socket.on('close', handleClose));
|
|
157
158
|
});
|
|
158
159
|
}
|
|
159
160
|
|
|
@@ -165,7 +166,7 @@ export class Server extends http.Server {
|
|
|
165
166
|
// return the listening port or any default port
|
|
166
167
|
get port() {
|
|
167
168
|
var _super$address;
|
|
168
|
-
return ((_super$address = super.address()) === null || _super$address === void 0 ? void 0 : _super$address.port) ??
|
|
169
|
+
return ((_super$address = super.address()) === null || _super$address === void 0 ? void 0 : _super$address.port) ?? _classPrivateFieldGet2(this, _defaultPort);
|
|
169
170
|
}
|
|
170
171
|
|
|
171
172
|
// return a string representation of the server address
|
|
@@ -180,7 +181,7 @@ export class Server extends http.Server {
|
|
|
180
181
|
}
|
|
181
182
|
|
|
182
183
|
// return a promise that resolves when the server is listening
|
|
183
|
-
listen(port =
|
|
184
|
+
listen(port = _classPrivateFieldGet2(this, _defaultPort)) {
|
|
184
185
|
return new Promise((resolve, reject) => {
|
|
185
186
|
let handle = err => off() && err ? reject(err) : resolve(this);
|
|
186
187
|
let off = () => this.off('error', handle).off('listening', handle);
|
|
@@ -191,13 +192,15 @@ export class Server extends http.Server {
|
|
|
191
192
|
// return a promise that resolves when the server closes
|
|
192
193
|
close() {
|
|
193
194
|
return new Promise(resolve => {
|
|
194
|
-
|
|
195
|
+
_classPrivateFieldGet2(this, _sockets).forEach(socket => socket.destroy());
|
|
195
196
|
super.close(resolve);
|
|
196
197
|
});
|
|
197
198
|
}
|
|
198
199
|
|
|
199
200
|
// initial routes include cors and 404 handling
|
|
200
201
|
|
|
202
|
+
// adds a route in the correct priority order
|
|
203
|
+
|
|
201
204
|
// set request routing and handling for pathnames and methods
|
|
202
205
|
route(method, pathname, handle) {
|
|
203
206
|
if (arguments.length === 1) [handle, method] = [method];
|
|
@@ -255,8 +258,8 @@ export class Server extends http.Server {
|
|
|
255
258
|
|
|
256
259
|
// create a url rewriter from provided rewrite rules
|
|
257
260
|
function _route2(route) {
|
|
258
|
-
let i =
|
|
259
|
-
|
|
261
|
+
let i = _classPrivateFieldGet2(this, _routes).findIndex(r => r.priority >= route.priority);
|
|
262
|
+
_classPrivateFieldGet2(this, _routes).splice(i, 0, route);
|
|
260
263
|
return this;
|
|
261
264
|
}
|
|
262
265
|
async function _handleRequest2(req, res) {
|
|
@@ -275,7 +278,7 @@ async function _handleRequest2(req, res) {
|
|
|
275
278
|
result && (result = !match || match(req.url.pathname));
|
|
276
279
|
if (result) req.params = result.params;
|
|
277
280
|
return result ? handle(req, res, next) : next();
|
|
278
|
-
}(
|
|
281
|
+
}(_classPrivateFieldGet2(this, _routes));
|
|
279
282
|
} catch (error) {
|
|
280
283
|
var _req$headers$accept, _req$headers$content;
|
|
281
284
|
let {
|
package/dist/snapshot.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@percy/core",
|
|
3
|
-
"version": "1.28.8
|
|
3
|
+
"version": "1.28.8",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
"publishConfig": {
|
|
11
11
|
"access": "public",
|
|
12
|
-
"tag": "
|
|
12
|
+
"tag": "latest"
|
|
13
13
|
},
|
|
14
14
|
"engines": {
|
|
15
15
|
"node": ">=14"
|
|
@@ -43,22 +43,22 @@
|
|
|
43
43
|
"test:types": "tsd"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@percy/client": "1.28.8
|
|
47
|
-
"@percy/config": "1.28.8
|
|
48
|
-
"@percy/dom": "1.28.8
|
|
49
|
-
"@percy/logger": "1.28.8
|
|
50
|
-
"@percy/webdriver-utils": "1.28.8
|
|
46
|
+
"@percy/client": "1.28.8",
|
|
47
|
+
"@percy/config": "1.28.8",
|
|
48
|
+
"@percy/dom": "1.28.8",
|
|
49
|
+
"@percy/logger": "1.28.8",
|
|
50
|
+
"@percy/webdriver-utils": "1.28.8",
|
|
51
51
|
"content-disposition": "^0.5.4",
|
|
52
52
|
"cross-spawn": "^7.0.3",
|
|
53
53
|
"extract-zip": "^2.0.1",
|
|
54
54
|
"fast-glob": "^3.2.11",
|
|
55
|
-
"micromatch": "^4.0.
|
|
55
|
+
"micromatch": "^4.0.6",
|
|
56
56
|
"mime-types": "^2.1.34",
|
|
57
57
|
"pako": "^2.1.0",
|
|
58
58
|
"path-to-regexp": "^6.2.0",
|
|
59
59
|
"rimraf": "^3.0.2",
|
|
60
|
-
"ws": "^8.
|
|
60
|
+
"ws": "^8.17.1",
|
|
61
61
|
"yaml": "^2.4.1"
|
|
62
62
|
},
|
|
63
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "1b93761a01b608afadf8d4efccacc11f925396bd"
|
|
64
64
|
}
|